【问题标题】:alarm stop's when signal arrive信号到达时报警停止
【发布时间】:2013-05-08 15:51:34
【问题描述】:

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

【问题讨论】:

    标签: c unix signals alarm


    【解决方案1】:

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

    尝试进行以下更改:

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

    【讨论】:

    • 首先,它不会返回循环,因为如果只有 1 个 SIGUSR2 信号到达,它不会激活警报。我等了 10 秒钟,它什么也没做。我确实将信号处理程序移到了循环之外,谢谢。但是,如果我将警报(1)移到循环之外并在警报处理函数中再次调用它,它只会执行一次警报功能。此外,循环除了警报(1)和暂停()什么都不做,所以如果我将它们移到循环之外,我可以完全听到循环。
    • 它当然应该返回循环。 pause() 在信号到达后返回。为什么不在循环中添加一些调试 printf()s 以说服自己何时执行哪些代码行?
    • 好吧,它起作用了,我只需要在警报处理函数中也清除警报处理函数。非常感谢!
    猜你喜欢
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多