我正在尝试将信号和警报结合起来。 我有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
...
}
答案 0 :(得分:0)
每当你得到SIGUSR2
(或任何类型的信号)时,你重复while
循环,并将你的闹钟定时器重置为1秒。这意味着如果SIGUSR2
信号每秒发出一次以上,您的警报就不会响起。
尝试进行以下更改:
signal()
以在循环外部配置警报处理程序。每次循环都不需要重置信号处理程序。一旦它们被设置,它们就会被设置。alarm(1)
后,请勿在循环中调用SIGALRM
。
相反,在开始循环之前调用alarm(1)
一次,然后再次从alarm_hand
函数内部重置计时器。