7

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

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

同时,我的问题是,有没有人知道当有大量磁盘存储并且没有争用已在附加模式下成功打开的文件时,哪些类型的情况会导致打印语句失败?

4

1 回答 1

7

您可能内存不足 (ENOMEM) 或超过文件大小限制 (E2BIG 或 SIGXFSZ)。您可能会遇到老式的 I/O 错误 (EIO)。如果脚本同时运行或通过 NFS 访问文件,您可能会遇到竞争条件。而且,当然,您可能会在要打印其值的表达式中出现错误。

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

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

于 2012-10-19T15:44:31.347 回答