如果posixclosures呼叫失败怎么办?

在我的系统(Ubuntu Linux,glibc)上, close调用的手册页指定了它可以返回的几个错误返回值。 它也说

不检查close()的返回值是一个常见但严重的编程错误。

并在同一时间

请注意,返回值只能用于诊断。 特别是close()不应该在EINTR之后重试,因为这可能导致来自另一个线程的重用描述符被closures。

所以我不允许忽略返回值,也不能重试呼叫。

鉴于此,我应该如何处理close()呼叫失败?

如果在写文件的时候发生了错误,我可能应该尝试在其他地方写信息以避免数据丢失。

如果我只是在阅读文件,我可以只logging失败,并继续假装什么都没有发生? 是否有任何警告,文件描述符泄漏或其他?

Solutions Collecting From Web of "如果posixclosures呼叫失败怎么办?"

在实践中, close不应该错误地重试,并且在close返回后,传递给close的fd总是无效(关闭),无论是否发生错误。 在某些情况下,错误可能表明数据丢失(某些NFS设置)或设备的异常硬件条件(例如磁带无法倒带),因此您可能希望谨慎以避免数据丢失,但不应尝试再次关闭fd。

从理论上讲,POSIX过去并不清楚在EINTR close失败时fd是否保持打开,系统不一致。 因为了解状态是非常重要的(否则你有漏洞或者双关闭错误在多线程程序中是非常危险的), 奥斯汀集团第529号问题的解决方案严格规定了将来版本的POSIX的行为, EINTR意味着FD仍然开放。 这与其他地方的EINTR定义一致,但是Linux拒绝接受。 (FWIW有一个简单的解决方法,这可以在libc的系统调用包装程序中实现;请参阅glibc PR#14627 。)幸运的是,它在实践中从来没有出现过。

您可能会发现一些相关的问题:

  • 检查close()中的错误的原因是什么?
  • 试图在Linux上关闭睡眠

首先: EINTR意思是:系统调用被中断,如果这发生在close()调用中,那么完全没有办法。

除了可能跟踪事实,如果fd属于一个文件,这个文件可能是损坏的,关于close()错误根本就没有什么可以做的 – 这取决于返回值。 AFAIK唯一的情况下,关闭可以重新审理EBUSY ,但我还没有看到。

所以:

  • 不检查close()的结果可能意味着你错过了文件损坏,特别是截断。
  • 根据错误,大部分时间你什么都不能做 – close()失败就意味着你的应用程序范围之外的东西已经非常错误了。