C语言中的嵌套信号处理程序

时间:2017-09-26 22:17:21

标签: c signal-handling

我想在两个独立进程(即编写器和阅读器)的上下文中处理信号处理程序以进行通知。编写器向读取器发送第一个信号SIGUSR1,循环直到它听到来自写入器的第二个信号SIGUSR2。

reader.c

static volatile sig_atomic_t done_waiting; 

int handler1(int signal){
    done_waiting = 0;
     while( !done_waiting ){
            (void)fprintf(stdout, " reader waiting for sigusr2: done_waiting = %d\n", done_waiting );
    }
(void)fprintf(stdout, " reader received sigusr2 \n);
}

int handler2 (int signal){
         done_waiting = 1;
}

main(){
    signal(SIGUSR1, handler1);
    signal(SIGUSR2, handler2);
    sleep(5); // sleep till we start worker
}

在writer.c中,信号以

的形式发送给阅读器
main(){
    kill(pid_reader, SIGUSR1);
    sleep(5);
    kill (pid_reader, SIGUSR2);
}

当我首先执行reader然后执行worker时,程序将在while循环中退出。作者打印出“没有找到属于你的匹配进程”。

是否允许嵌套信号处理程序,如果是,是否建议使用?此外,还有其他替代机制供作者通知读者已准备好吗?

1 个答案:

答案 0 :(得分:1)

嵌套的信号实际上是你的意思,而不是嵌套的信号 处理程序?为了澄清,如果在执行SIGUSR1的处理程序时收到SIGUSR2会发生什么,这是什么意思?我这么认为,

我测试了你的代码,并进行了一些修改,以便将读者进程的pid放入编写器进程中,我将args用于main。

我得到的结果是。

  1. 第一位读者很安静
  2. 收到SIGUSR1后,它开始连续写入等待SIGUSR2
  3. 接收SIGUSR2时,会打印“reader received SIGUSR2”
  4. 这表示可以嵌套信号。但是我不会说它被推荐为有意设计。 正如评论中所提到的,你应该在信号处理程序中尽可能少地做,绝对不能在while循环中循环。 正如评论中提到的那样,要非常小心你在信号上下文中调用哪些函数,printf()是不行的,即使它似乎工作正常。

    在Linux上测试,使用古代内核3.16和gcc 4.9