检查是否错误!= 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
,它用于跟踪重启系统调用的信息和参数