0

我以这种方式从文件中读取整数:

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,我是否必须重复阅读?

4

1 回答 1

0

如果您没有弄乱信号,则不必担心。原因如下:信号的动作要么是终止、忽略,要么是调用处理程序(或停止/继续,但让我们忽略这些),所以,除非你明确地捕捉到任何信号,否则你永远不必考虑EINTR——它只会发生ifread(2)被您设置的信号处理程序中断,被调用并返回。

如果你捕捉到了一个信号,那么慢速系统调用是否自动重新启动由可以在设置信号处理程序之前的字段中SA_RESTART设置/取消设置的标志控制。如果您希望和其他人在处理程序返回后自动重新启动,那么您必须指定此标志以保持代码可移植性(默认行为因平台而异)。sa_flagsstruct sigactionread(2)

在某些情况下,有几个接口即使SA_RESTART设置了也不会自动重启;请参阅man 7 signal以查看列表。

如果您想知道:慢速系统调用是在某些条件下可以永久阻塞的系统调用:例如,read()来自终端或套接字、open(2)FIFOwait(2)和系列、文件锁定接口、某些ioctl(2)调用等的 s。

于 2015-06-27T14:26:46.067 回答