posix关闭呼叫失败怎么办?

Ily*_*pov 18 c unix linux error-handling posix

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

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

同时

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

所以我不允许忽略返回值,也不允许重试调用.

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

如果在我向文件写入内容时发生错误,我可能应该尝试在其他地方写入信息以避免数据丢失.

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

R..*_*R.. 9

在实践中,close永远不应该在出错时重试,并且无论是否发生错误,传递给的fd closeclose返回后总是无效(关闭).在某些情况下,错误可能表示数据丢失(某些NFS设置)或设备的异常硬件条件(例如磁带无法倒带),因此您可能需要小心避免数据丢失,但是您绝不应该尝试再次关闭fd.

从理论上讲,POSIX过去不清楚fd在close失败时是否保持开放EINTR,而且系统不同意.因为知道状态很重要(否则你有fd泄漏或双重错误在多线程程序中非常危险),奥斯汀集团问题#529的解决方案严格指定了POSIX未来版本的行为,这EINTR意味着fd仍然开放.这是与EINTR其他地方的定义一致的正确行为,但Linux拒绝接受它.(FWIW有一个简单的解决方法,可以在libc系统调用包装器级别使用;请参阅glibc PR#14627.)幸运的是,它无论如何都不会在实践中出现.

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