检查errno!= EINTR:这是什么意思?

时间:2017-01-04 22:29:26

标签: c linux linux-kernel signals posix

我发现这段代码多次使用(也是使用open()代替write()的类似代码)。

int c = write(fd, &v, sizeof(v));
if (c == -1 && errno != EINTR) {
    perror("Write to output file");
    exit(EXIT_FAILURE);
}

为什么&& errno != EINTR在这里检查?

man 上寻找errno我找到了关于EINTR的以下文字,但即使我访问了man 7 signal,也没有启发我。

  

EINTR中断函数调用(POSIX.1);见信号(7)。

3 个答案:

答案 0 :(得分:20)

如果系统调用正在进行时发生信号,许多系统调用将报告EINTR错误代码。实际上没有发生错误,只是报告了这种情况,因为系统无法自动恢复系统调用。这种编码模式只是在发生这种情况时重试系统调用,以忽略中断。

例如,如果程序在计时器用完时使用alarm()异步运行某些代码,则可能会发生这种情况。如果在程序调用{​​{1}}时发生超时,我们只想重新启动它。

答案 1 :(得分:2)

来自write上的man page

  

在写入任何数据之前,呼叫被信号中断

答案 2 :(得分:2)

这里的答案真的很好,我想补充一些内部细节:

  

被信号中断的系统调用可以中止和   返回EINTR或自动重启   当且仅当SA_RESTART中指定了sigaction(2)

负责执行此任务的是restart_block,它用于跟踪信息和重新启动系统调用的参数