C 中的嵌套信号处理程序
Nested signal handlers in C
我想在两个独立进程的上下文中处理信号处理程序,即 writer 和 reader 用于通知。写入器将第一个信号 SIGUSR1 发送到 reader,循环直到它听到来自写入器的第二个信号 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 中,信号发送到 reader 作为
main(){
kill(pid_reader, SIGUSR1);
sleep(5);
kill (pid_reader, SIGUSR2);
}
当我先执行 reader 然后执行 worker 时,程序在 while 循环中退出。然后作者打印出 "No matching processes belonging to you were found"。
是否允许嵌套信号处理程序?如果是,是否推荐这样做?另外,是否有其他替代机制让作者通知 reader 它已准备就绪?
可能嵌套 signals 实际上是你的意思,而不是嵌套 signal handlers ?澄清一下,如果在执行 SIGUSR1 的处理程序时收到 SIGUSR2 会发生什么,这是你的意思吗?我想是的,
我测试了您的代码,并进行了一些修改,以将 reader 进程的 pid 放入编写器进程中,我将 args 用于 main。
我得到的结果是。
- 先reader安静
- 收到SIGUSR1后开始连续写入等待SIGUSR2
- 当接收到SIGUSR2时,打印"reader received SIGUSR2"
这表示可以有嵌套信号。但是我不会说这是一种有意的设计。
如评论中所述,您应该在信号处理程序中尽可能少地做,绝对不要在 while 循环中循环。
并且正如评论中所提到的,要非常小心你在信号上下文中调用的函数,printf() 是不行的,即使它看起来工作正常。
在 Linux 上测试,使用古老的内核 3.16 和 gcc 4.9
我想在两个独立进程的上下文中处理信号处理程序,即 writer 和 reader 用于通知。写入器将第一个信号 SIGUSR1 发送到 reader,循环直到它听到来自写入器的第二个信号 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 中,信号发送到 reader 作为
main(){
kill(pid_reader, SIGUSR1);
sleep(5);
kill (pid_reader, SIGUSR2);
}
当我先执行 reader 然后执行 worker 时,程序在 while 循环中退出。然后作者打印出 "No matching processes belonging to you were found"。
是否允许嵌套信号处理程序?如果是,是否推荐这样做?另外,是否有其他替代机制让作者通知 reader 它已准备就绪?
可能嵌套 signals 实际上是你的意思,而不是嵌套 signal handlers ?澄清一下,如果在执行 SIGUSR1 的处理程序时收到 SIGUSR2 会发生什么,这是你的意思吗?我想是的,
我测试了您的代码,并进行了一些修改,以将 reader 进程的 pid 放入编写器进程中,我将 args 用于 main。
我得到的结果是。
- 先reader安静
- 收到SIGUSR1后开始连续写入等待SIGUSR2
- 当接收到SIGUSR2时,打印"reader received SIGUSR2"
这表示可以有嵌套信号。但是我不会说这是一种有意的设计。 如评论中所述,您应该在信号处理程序中尽可能少地做,绝对不要在 while 循环中循环。 并且正如评论中所提到的,要非常小心你在信号上下文中调用的函数,printf() 是不行的,即使它看起来工作正常。
在 Linux 上测试,使用古老的内核 3.16 和 gcc 4.9