【问题标题】:Relationship slow system call with signal与信号的关系慢系统调用
【发布时间】:2011-09-07 18:02:43
【问题描述】:

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

但是当我执行它时,超时什么也没做。
我不明白为什么。
你能解释一下并给我看另一个慢速系统调用的例子吗?

#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);
}    

【问题讨论】:

    标签: signals system-calls


    【解决方案1】:

    你的处理程序在一秒钟后被调用。如果你检查你会看到它被调用。我不建议使用printf,因为它不是异步信号安全的,你可以让它设置一个变量或其他东西。

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

    列表不是标准的,但 IIRC read(v)write(v) 和朋友是经常重启的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-18
      • 2014-09-10
      • 1970-01-01
      • 1970-01-01
      • 2017-07-31
      • 1970-01-01
      • 2016-02-09
      • 2017-05-07
      相关资源
      最近更新 更多