从磁盘和EINTR读取

时间:2014-12-06 02:38:59

标签: c signals errno

如果您阅读了大量数据,是否有必要检查errno == EINTR?我使用pread()函数来阅读。在我所有的时间里,我从未见过EINTR返回,但我在网上看到了一些明确检查它的代码。

所以真的有必要检查EINTR并重播电话吗?

2 个答案:

答案 0 :(得分:1)

当系统调用因您的进程收到信号而中断时,将返回EINTR。如果您的进程在内核中被阻塞,等待读取完成,并且捕获到信号,则此可能唤醒内核;这取决于操作是否可中断。睡眠I / O例程被唤醒,并且应该将EINTR返回到用户空间。

在内核返回用户空间之前,它会检查待处理的信号。如果信号处于待处理状态,它将采取与该信号相关的操作。可能的操作包括:将信号分派给信号处理程序,终止进程或忽略信号。假设这不会终止您的进程和/或您的信号处理程序正常返回,系统调用将返回EINTR。

如果您没有想到这一点,通常需要再次尝试操作,但这也可以用作优雅中止I / O操作的方法。例如,alarm(2)可用于实现超时,如果I / O未及时完成,则传递SIGALRM。在您的信号处理程序中,您可以设置一个指示超时的标志,当您的读操作返回EINTR时,您可以检查您的超时标志。

答案 1 :(得分:0)

原因是 - 例如,在繁忙的系统上,可能会在读取时产生中断。 因此,在您的桌面上,您可能永远不会看到它。在超载的服务器上,您可以。

在UNIX环境中进行高级编程的第5章--Stevens和Rago。有一个完整的解释。