这个问题一定很简单,但是..我不知道这是什么。它应该继续打印“警报”一段时间,但是只执行一次,然后程序死:

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
#include <signal.h>

void onAlarm();

void setupAlarm() {
 signal(SIGALRM, onAlarm);
 alarm(1);
}

void onAlarm() {
 setupAlarm();
 printf("alarmmmmmmmmmmmmmmmmm\n");
}

void main()
{
 setupAlarm();
 sleep(1000);
}


这里可能有什么问题?取出sleep(1000)会使程序立即死亡(即,甚至不显示一个“ alaaarm”)。

回答

好的,下面的代码可以工作:

void onAlarm() {
    printf("alarmmmmmmmmmmmmmmmmm\n");
    alarm(1);
    sleep(1);
}

void main()
{
    signal(SIGALRM, onAlarm);
    alarm(1);
    sleep(2);
}


但是我仍然在解决这个问题,并试图理解为什么我需要这样编码。

最佳答案

糟糕,我之前的回答是完全错误的。查看调用onAlarm()时会发生什么:


它重置信号处理程序,
它重置警报
取消先前的警报后,它将再次开始等待。


哪个代码路径实际到达您的printf调用?

08-19 18:42