如果您读取大量数据,是否有必要检查errno == EINTR?我使用pread()函数来读取。在我所有的时间里,我从来没有见过EINTR返回,但我在网上看到了一些代码,它明确地检查它。
那么,真的有必要检查EINTR并可能重复调用吗?
发布于 2014-12-06 11:22:02
当as系统调用由于您的进程接收到信号而中断时,将返回EINTR。如果您的进程在内核中被阻塞,等待读取完成,并且捕获到一个信号,这可能会唤醒内核;这取决于操作是否可中断。休眠I/O例程被唤醒,并期望将EINTR返回到用户空间。
就在内核返回到用户空间之前,它会检查挂起的信号。如果信号处于挂起状态,它将采取与该信号相关的操作。可能的操作包括:将信号分派到信号处理程序、终止进程或忽略信号。假设这不会杀死您的进程和/或您的信号处理程序正常返回,则系统调用将返回EINTR。
如果您没有预料到这一点,您通常希望再次尝试该操作,但这也可以用作一种优雅地中止I/O操作的方法。例如,alarm(2)可用于实现超时,如果I/O未及时完成,则发送SIGALRM。在您的信号处理程序中,您可以设置一个指示超时的标志,当您的读取操作返回EINTR时,您可以检查超时标志。
发布于 2014-12-06 10:52:53
原因是-例如,在繁忙的系统上,可能会在读取时发生中断。因此,在您的桌面上,您可能永远看不到它。在超载的服务器上,您可以。
Se UNIX环境中的高级编程的第5章-史蒂文斯和Rago。有一个完整的解释。
https://stackoverflow.com/questions/27327723
复制相似问题