gpt4 book ai didi

c - 从磁盘读取和 EINTR

转载 作者:行者123 更新时间:2023-11-30 15:26:33 24 4
gpt4 key购买 nike

如果读取大量数据,是否需要检查errno == EINTR?我使用 pread() 函数来读取。在我的一生中,我从未见过 EINTR 返回,但我在网上看到了一些代码,其中明确地检查了它。

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

最佳答案

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

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

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com