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

所以真的有必要检查EINTR并可能重复通话吗?

最佳答案

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

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

如果您不期望这样做,通常希望再次尝试该操作,但这也可以用作正常中止I / O操作的方法。例如,alarm(2)可用于实现超时,如果I / O没有及时完成,则SIGALRM将被传递。在信号处理程序中,您可以设置一个指示超时的标志,并且当您的读取操作返回EINTR时,您可以检查超时标志。

关于c - 从磁盘和EINTR读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27327723/

10-11 15:55