如果posix关闭调用失败怎么办?
在我的系统(Ubuntu
Linux,glibc)上,一个close调用的man页面指定了可以返回的几个错误返回值.它也说
并在同一时间
所以我不能忽略返回值,也不能重试该调用. 鉴于此,我应该如何处理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()? (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |