我想在两个独立进程(即编写器和阅读器)的上下文中处理信号处理程序以进行通知。编写器向读取器发送第一个信号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循环中退出。作者打印出“没有找到属于你的匹配进程”。
是否允许嵌套信号处理程序,如果是,是否建议使用?此外,还有其他替代机制供作者通知读者已准备好吗?
答案 0 :(得分:1)
嵌套的信号实际上是你的意思,而不是嵌套的信号 处理程序?为了澄清,如果在执行SIGUSR1的处理程序时收到SIGUSR2会发生什么,这是什么意思?我这么认为,
我测试了你的代码,并进行了一些修改,以便将读者进程的pid放入编写器进程中,我将args用于main。
我得到的结果是。
这表示可以嵌套信号。但是我不会说它被推荐为有意设计。 正如评论中所提到的,你应该在信号处理程序中尽可能少地做,绝对不能在while循环中循环。 正如评论中提到的那样,要非常小心你在信号上下文中调用哪些函数,printf()是不行的,即使它似乎工作正常。
在Linux上测试,使用古代内核3.16和gcc 4.9