2014-12-06 91 views
0

如果读取海量数据,是否需要检查errno == EINTR?我使用pread()函数来读取。在我所有的时间里,我从未见过EINTR返回,但我已经看到一些代码在线,它明确检查它。从磁盘读取和EINTR

所以真的有必要检查EINTR并可能重复呼叫?

回答

0

原因是 - 例如,在繁忙的系统上,可能在读取时产生中断。 因此,在你的桌面上你可能永远都看不到它。在超载的服务器上,您可以。在UNIX环境下高级编程的第5章 - Stevens和Rago。有一个完整的解释。

1

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

就在内核返回到用户空间之前,它检查未决信号。如果信号未决,它将采取与该信号相关的操作。可能的操作包括:将信号发送到信号处理程序,终止进程或忽略信号。假设这不会消除你的进程和/或你的信号处理程序正常返回,系统调用将返回EINTR。

如果您不期待这样,您通常需要再次尝试该操作,但这也可以用作正常中止I/O操作的方式。例如,alarm(2)可用于实现超时,如果I/O未及时完成,则会发送SIGALRM。在你的信号处理程序中,你可以设置一个标志来指示超时,当你的读操作返回EINTR时,你可以检查你的超时标志。