从常规文件中读取时,read()会因EINTR而失败

时间:2016-02-05 12:17:18

标签: signals system-calls interruption

就在我记忆中,read()不能被信号打断,并且在从常规文件中读取时返回errno=EINTR,同样在写入常规文件时返回write()

这与读取或写入终端,管道,插座等相反。

这在Linux上是否正确?

这是由POSIX强制执行的吗?

编辑:假设我们正在讨论未配置为自动重启系统调用的信号中断。

1 个答案:

答案 0 :(得分:0)

实际上,大多数程序都期望这种行为,但如果EINTR确实发生了,结果代码将指示实际读取了多少字节,可能为零。因此,如果您已经进行了防御性编码以正确处理短读取(使用循环通过n重试len-n来指示指针),那么您甚至都不会注意到。出于这个原因,我总是把网络读取放在循环中。由于所有内容都是文件,因此您无法确定调用方没有为您提供TCP连接,因此最好提供短读取。

我不是规范律师,所以我不知道或不关心规范的内容。实际上,除非它发生,否则它不会发生。