我发现这段代码多次使用(也是使用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)。
答案 0 :(得分:20)
如果系统调用正在进行时发生信号,许多系统调用将报告EINTR
错误代码。实际上没有发生错误,只是报告了这种情况,因为系统无法自动恢复系统调用。这种编码模式只是在发生这种情况时重试系统调用,以忽略中断。
例如,如果程序在计时器用完时使用alarm()
异步运行某些代码,则可能会发生这种情况。如果在程序调用{{1}}时发生超时,我们只想重新启动它。
答案 1 :(得分:2)
来自write
上的man page:
在写入任何数据之前,呼叫被信号中断
答案 2 :(得分:2)
这里的答案真的很好,我想补充一些内部细节:
被信号中断的系统调用可以中止和 返回
EINTR
或自动重启 当且仅当SA_RESTART
中指定了sigaction(2)
负责执行此任务的是restart_block
,它用于跟踪信息和重新启动系统调用的参数