信号到达时报警停止

时间:2013-05-08 15:51:34

标签: c unix signals alarm

我正在尝试将信号和警报结合起来。 我有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
...
}

1 个答案:

答案 0 :(得分:0)

每当你得到SIGUSR2(或任何类型的信号)时,你重复while循环,并将你的闹钟定时器重置为1秒。这意味着如果SIGUSR2信号每秒发出一次以上,您的警报就不会响起。

尝试进行以下更改:

  • 移动两个signal()以在循环外部配置警报处理程序。每次循环都不需要重置信号处理程序。一旦它们被设置,它们就会被设置。
  • 在可能未收到alarm(1)后,请勿在循环中调用SIGALRM。 相反,在开始循环之前调用alarm(1)一次,然后再次从alarm_hand函数内部重置计时器。
相关问题