如何在C中管理信号读取?

时间:2015-06-27 14:11:40

标签: file integer signals errno eintr

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

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

1 个答案:

答案 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)调用等