什么可能导致perl中的打印错误?

时间:2012-10-19 14:56:26

标签: perl

我有一个长时间运行的脚本,每小时打开一个文件,打印到它并关闭文件。我最近很少发现,打印失败了,不是因为我正在测试打印本身的状态,而是因为在系统实际重启之前文件中缺少条目的事实!

我为文件打开失败做了陷阱,并在发生这种情况时向syslog写了一条消息,我没有看到任何打开的失败,所以我现在猜测它可能是失败的打印。我没有捕获打印失败,我怀疑大多数人没有,但我现在要更新那个打印。

与此同时,我的问题是,有没有人知道什么类型的情况可能导致打印语句失败,当有足够的磁盘存储并且没有争用已成功打开的文件?

1 个答案:

答案 0 :(得分:7)

您可能是内存不足(ENOMEM)或文件大小限制(E2BIG或SIGXFSZ)。您可能有一个老式的I / O错误(EIO)。如果脚本同时运行或者通过NFS访问文件,则可能会出现争用情况。当然,您可能会在要打印的值的表达式中出现错误。

我曾经看到的一个奇特的原因是CPU散热器故障可能导致sprintf虚假失败,导致一些令人惊讶的结果,包括将垃圾写入文件描述符。

最后,我提醒您,print通常会将其内容写入I / O缓冲区。这意味着两件事。 (1)你还需要检查close()的结果。 (2)如果你打印但没有立即关闭()或flush(),那么你的数据可以被缓冲,直到很久之后才被实际写入(或者如果进程死得很厉害,则根本不写入。)

相关问题