如果posix关闭调用失败怎么办?

前端之家收集整理的这篇文章主要介绍了如果posix关闭调用失败怎么办?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在我的系统(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

原文链接:https://www.f2er.com/c/115033.html

猜你在找的C&C++相关文章