我以这种方式从文件中读取整数:
int v, num;
for(;;) {
v = read(fd, &num, sizeof(int));
if (v == -1) {
fprintf(stderr, "Error in read()\n");
exit(EXIT_FAILURE);
}
if (v == 0)
break;
[...]
}
如果信号到达会发生什么? 我该如何管理errno == EINTR?如果errno == EINTR,我是否必须重复阅读?
答案 0 :(得分:0)
如果你没有弄乱信号,你不必担心它。原因如下:信号的动作是终止,忽略或调用处理程序(或停止/继续,但让我们忽略这些),因此,除非您明确发现任何信号,你将永远不必考虑---
classes: ntp
ntp::autoupdate: true
ntp::enable: true
ntp::servers:
- grover.example.com iburst
- kermit.example.com iburst
- 只有当EINTR
被你设置,调用并返回的信号处理程序中断时才会发生。
如果您发现信号,那么是否自动重启慢速系统调用是由read(2)
标志控制的,SA_RESTART
标志可以在sa_flags
字段struct sigaction
之前设置/取消设置信号处理程序。如果您希望read(2)
和其他人在处理程序返回后自动重新启动,那么您必须指定此标志以保持代码可移植(默认行为因平台而异)。
在某些情况下,即使设置了SA_RESTART
,仍有一些界面无法自动重启;请参阅man 7 signal
查看列表。
如果您想知道:慢速系统调用是在某些条件下可以永久阻止的系统调用:例如,read()
来自终端或套接字,open(2)
来自FIFO,{{1和/,文件锁定接口,一些wait(2)
调用等