0

我正在尝试将信号和警报结合起来。我有 2 个进程。1 接收来自用户的输入,并将其写入管道,然后将信号(SIGUSR2)发送到另一个进程。在另一个过程中,我有无限循环,每秒产生一次警报。所以我的程序应该同时处理警报信号和 SIGUSR2 信号。警报句柄工作正常,但是当信号到达并且信号处理程序处于活动状态时,它似乎不会返回到产生警报的循环。我阅读了警报和信号的手册页,但没有找到任何东西。它说信号处理函数应该返回原始代码,但事实并非如此。我想知道为什么代码在信号处理程序之后不返回循环,以及如何强制它每秒执行一次警报处理程序功能,即使同时收到信号。

这是循环:

while (1) {
signal (SIGUSR2 , signal_hand);
signal (SIGALRM , alarm_hand);
alarm (1);
pause();
}

这是信号处理函数:

void signal_hand (int sig) {
// reading from the pipe and doing things accordingly
...
}

这是警报处理函数:

void alarm_hand (int sig) {
// doing things
...
}
4

1 回答 1

0

每次收到SIGUSR2(或任何类型的信号)时,您都会重复while循环,这会将您的闹钟计时器重置为 1 秒。这意味着如果SIGUSR2信号每秒出现一次以上,您的警报将永远不会响起。

尝试进行以下更改:

  • 移动这两个signal()以在循环之外配置您的警报处理程序。无需每次通过循环都重置信号处理程序。一旦设置好了,它们就设置好了。
  • 在可能没有收到a 之后不要alarm(1)在循环中调用。SIGALRM相反,alarm(1)在开始循环之前调用一次,然后再次从alarm_hand函数内部重置计时器。
于 2013-05-08T16:34:26.890 回答