【问题标题】:how to always handle ctrl c signal after 10 secs如何在 10 秒后始​​终处理 ctrl c 信号
【发布时间】: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 秒后设置回调函数吗?

标签: c linux signals sleep


【解决方案1】:

如果您希望线程继续运行,请使用 alarm() 安排 10 秒后唤醒。

signal(SIGALRM, my_handler);

void signal_handler(int sig_num) {
    alarm(10);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-24
    相关资源
    最近更新 更多