检查是否错误!= EINTR:这是什么意思?

我发现这段代码多次使用(也是一个类似的代码,它使用的是open()而不是write() )。

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

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

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

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

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

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

从手册页上write

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

这里的答案非常好,我想添加一些内部细节:

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

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