【发布时间】:2016-07-16 07:56:40
【问题描述】:
当用户按下 ctrl c 时,根据我的要求,我应该只在 10 秒后处理它。
为此,我在实际有效的信号处理函数中添加了 sleep(10)。 我不确定它是如何工作的。这是实现它的正确方法吗?如果在信号处理程序中调用它,睡眠会破坏任何东西。我真的很想知道它是如何工作的。实现这个的正确方法是什么
signal_hanlder(int sig num)
{
sleep(10);
my_handler();
}
【问题讨论】:
-
您到底有什么疑问?根据signal manual
sleep是异步安全的,因此可以调用信号处理程序。但这是否是最好/正确的方法取决于您的确切要求。例如,如果要求程序在处理信号之前再正常运行 10 秒,那么显然上述代码将无法满足该要求,因为sleep暂停执行。 -
@kaylum.: 我只是担心这是对还是错。我不确定信号处理程序如何才能休眠。 “程序在处理信号之前正常运行 10 秒然后显然上述代码将不满足该要求,因为睡眠暂停执行”是什么意思。暂停执行什么?这个信号处理程序或某个线程?
-
对于 SIGINT,信号处理程序可以在进程内的任何线程中运行。当信号处理程序正在运行时,正常的线程执行被中断,并且在信号处理程序返回之前不会恢复。因此,如果您在信号处理程序中调用
sleep,则意味着正常的线程执行也在睡眠时间被暂停。这是否是正确的行为取决于您的要求。 -
程序冻结 10 秒有什么意义?它更有可能在退出前继续播放河内塔(或其他任何东西)10 秒。
-
当我尝试时,我期望运行 10 秒的线程按预期运行。我可以在 10 秒后设置回调函数吗?