首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从磁盘和EINTR读取

从磁盘和EINTR读取
EN

Stack Overflow用户
提问于 2014-12-06 10:38:59
回答 2查看 322关注 0票数 0

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

那么,真的有必要检查EINTR并可能重复调用吗?

EN

回答 2

Stack Overflow用户

发布于 2014-12-06 11:22:02

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

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

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

票数 1
EN

Stack Overflow用户

发布于 2014-12-06 10:52:53

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

Se UNIX环境中的高级编程的第5章-史蒂文斯和Rago。有一个完整的解释。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27327723

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档