gpt4 book ai didi

c - C 中的嵌套信号处理程序

转载 作者:行者123 更新时间:2023-11-30 14:54:53 24 4
gpt4 key购买 nike

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

读者.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 循环处退出。作者打印出“未找到属于您的匹配进程”。

是否允许嵌套信号处理程序?如果是,是否建议这样做?另外,作者是否还有其他替代机制来通知读者它已准备好?

最佳答案

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

我测试了您的代码,并进行了一些修改,以便将读取器进程的 pid 放入写入器进程中,我使用了 main 的参数。

我得到的结果是。

  1. 第一位读者很安静
  2. 收到 SIGUSR1 后,开始连续写入等待 SIGUSR2
  3. 收到SIGUSR2时,打印“reader收到SIGUSR2”

这表明可以有嵌套信号。但我不会说这是推荐的有意设计。正如评论中提到的,您应该在信号处理程序中尽可能少地执行操作,绝对不要在 while 循环中循环。正如评论中提到的,要非常小心在信号上下文中调用的函数, printf() 是不行的,即使它看起来工作正常。

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

关于c - C 中的嵌套信号处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46436634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com