在我的系统(Ubuntu
Linux,glibc)上,一个close调用的man页面指定了可以返回的几个错误返回值.它也说
Not checking the return value of close() is a common but nevertheless serIoUs programming error.
并在同一时间
Note that the return value should only be used for diagnostics. In particular close() should not be retried after an EINTR since this may cause a reused descriptor from another thread to be closed.
所以我不能忽略返回值,也不能重试该调用.
鉴于此,我应该如何处理close()调用失败?
解决方法
实际上,关闭不应该重新出现错误,并且传递给关闭的fd在关闭返回后总是无效(关闭),而不管是否发生错误.在某些情况下,错误可能表示数据丢失(某些NFS设置)或设备的异常硬件条件(例如磁带无法重新卷绕),因此您可能希望谨慎以避免数据丢失,但不应尝试再次关闭fd
理论上来说,POSIX在过去是不明确的,如果FD在EINTR关闭失败时保持打开状态,系统不同意.由于重要的是要知道状态(否则你有fd泄漏或双重密切的错误,这在多线程程序中是非常危险的),所以Austin Group issue #529的解决方案严格规定了POSIX的未来版本的行为,EINTR意味着fd保持打开状态.这是与其他地方的EINTR定义一致的正确行为,但Linux拒绝接受. (FWIW有一个简单的解决方法,这可以在libc syscall包装器级别;参见glibc PR #14627.)幸运的是,它在实践中永远不会出现.
一些相关的问题你可能会发现信息丰富:
> What are the reasons to check for error on close()?
> Trying to make close sleep on Linux