关系缓慢的系统调用与信号



我正在学习缓慢的系统调用和信号
对于正常系统,缓慢的系统调用(从终端设备读取)可能永远阻塞
并且在下面的示例中,可以在一段时间后读取到超时。

但当我把它挖出来的时候,暂停并没有什么作用
我不明白为什么
你能解释并给我看另一个慢速系统调用的例子吗?

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
static void sig_alrm(int signo){
}
int main(){
    int n;
    char line[50];
    if(signal(SIGALRM, sig_alrm) == SIG_ERR)
        printf("signal(SIGALRM) error");
    alarm(1);
    if((n = read(STDIN_FILENO, line, 50)) < 0)
        printf("read error");
    alarm(0);
    write(STDOUT_FILENO, line, n);
    exit(0);
}    

您的处理程序会在一秒钟后被调用。如果你检查一下,你会发现它被调用了。我不建议放一个printf,因为它不是异步信号安全的,放你可以让它设置一个变量或其他什么。

不管怎样,回到问题上来。如果你想知道为什么read没有用EINTR失败,答案是SA_RESTART。在大多数Unix系统上,一些系统调用会在出现信号时自动重新启动。

该列表不是标准的,但IIRC read(v)write(v)和好友是通常重新启动的列表的一部分。

最新更新