【发布时间】:2019-12-06 01:38:44
【问题描述】:
根据 POSIX,有一些系统调用支持的 i/o 函数(我最近发现至少两个:stat() 和 mkdir(),但几乎可以肯定还有更多)在可能的 errno 值中没有 EINTR,但肯定会因为磁盘繁忙或网络挂载的文件系统而阻塞。
我怀疑可能存在从这些函数返回 EINTR 的稍微不符合 POSIX 的实现,尤其是在网络文件系统上。那可能性有多大?是否有必要检查 stat() 的 EINTR 或者我可以绝对确定这个系统调用不会被中断?
更新 如回答和评论中所述,POSIX 2.3 允许:
如果且仅当所有这些错误条件始终可以与本卷 POSIX.1-2017 中描述的错误条件相同的情况下,实施可能会在此处列出的错误编号。对于本卷 POSIX.1-2017 中描述的错误情况,实施不应生成与本卷 POSIX.1-2017 所要求的错误编号不同的错误编号,但可能会产生额外的错误,除非针对特定功能明确禁止。
但是有一件重要的事情:EINTR 实际上不是 error 条件(从任何角度来看它都不是失败),并且它的正确处理总是需要一些特殊的代码.
举例说明我的意思:假设stat() 从 NFS 处理程序返回 POSIX 未记录的 ECONNRESET。这个错误代码没有记录,但它不会造成任何伤害:我们知道系统调用由于某种原因失败了,我们的错误处理程序可能不关心发生了什么确切的错误,因为所有这些都意味着失败。 EINTR 完全不同。
【问题讨论】:
-
即使他们这样做了,我也不认为这违反了 POSIX 合规性。 POSIX 2.3 说:“当且仅当所有这些错误条件始终可以与本卷 POSIX.1-2017 中描述的错误条件相同的情况下,实现可能会在此处列出的错误编号。”从
stat()返回的EINTR应该是真的,意味着有信号中断了调用,你可以再试一次。