如何始终在10秒后处理ctrl c信号

如何始终在10秒后处理ctrl c信号,c,linux,signals,sleep,C,Linux,Signals,Sleep,当任何用户按下ctrl c时,根据我的要求,我应该在10秒后处理它 为此,我在信号处理函数中添加了sleep(10),它实际上可以工作。 我不知道它是如何工作的。这是实现它的正确方法吗?如果在信号处理程序中调用,睡眠会破坏任何东西吗。我真的很想知道它是如何工作的。正确的方法是什么 signal_hanlder(int sig num) { sleep(10); my_handler(); } 如果希望线程继续运行,请使用计划10秒后的唤醒 signal(SIGALRM, my_

当任何用户按下ctrl c时,根据我的要求,我应该在10秒后处理它

为此,我在信号处理函数中添加了sleep(10),它实际上可以工作。 我不知道它是如何工作的。这是实现它的正确方法吗?如果在信号处理程序中调用,睡眠会破坏任何东西吗。我真的很想知道它是如何工作的。正确的方法是什么

signal_hanlder(int sig num)
{
    sleep(10);
    my_handler();
}

如果希望线程继续运行,请使用计划10秒后的唤醒

signal(SIGALRM, my_handler);

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

你到底有什么疑问?根据
sleep
是异步安全的,因此可以调用信号处理程序。但这是否是最好/正确的方法取决于您的具体要求。例如,如果要求程序在处理信号之前再正常运行10秒,那么上述代码显然不符合要求,因为
sleep
暂停执行。@kaylum.:我只是担心它是对还是错。我不知道一个信号处理程序是如何睡眠的。你所说的“在信号被处理之前,程序正常运行10秒,显然上述代码将无法满足该要求,因为睡眠暂停执行”是什么意思。暂停执行什么?此信号处理程序或某个线程?对于SIGINT,信号处理程序可以在进程内的任何线程中运行。当信号处理程序正在运行时,正常的线程执行被中断,并且在信号处理程序返回之前不会恢复。因此,如果在信号处理程序中调用
sleep
,则意味着正常的线程执行也会在睡眠时间暂停。这是否正确取决于您的要求。程序冻结10秒有什么意义?更有可能的是,它应该在退出之前继续玩河内塔(或其他任何游戏)10秒。当我尝试时,我预期运行10秒的线程正在按预期运行。我可以在10秒后设置回拨功能吗?