为什么最后一行没有被这段代码执行?

时间:2015-02-11 00:22:33

标签: system alarm

int main()
{
    alarm(2);
    printf("still going\n");
    while (1);
    printf("should this line be executed?\n");
}

我知道alarm()会中断执行,将闹钟设置为关闭并将其移回。为什么最后一行没有被执行?

2 个答案:

答案 0 :(得分:1)

它没有打印,因为while(1);是一个无限循环。因此,在没有alarm()调用的情况下,这将永远运行。

但是,如果您没有抓住该程序,则在致电alarm()两秒后生成信号会导致程序终止。

赢得所做的是导致循环退出并继续执行程序。它将关闭程序,快速智能。

如果你捕获信号,但你的捕获函数刚刚返回,它将最终回到无限循环内。

有关这两种情况的更多详细信息,请检查以下代码:

#include <stdio.h>
#include <unistd.h>
#include <signal.h>

int fired = 0;
void handler (int sig) {
    fired = 1;
}

int main (void) {
    // signal (SIGALRM, handler);
    alarm  (2);
    printf ("Starting.\n");
    while (1) {
        if (fired) {
            fired = 0;
            printf ("Alarm fired.\n");
            alarm  (2);
        }
    }

    printf ("You will never see this.\n");
    return 0;
}

如果您运行该代码,它将打印出Starting消息,运行约两秒钟,然后退出而不打印任何其他内容。这是因为您没有捕获信号,所以默认操作就是终止该过程。

如果您取消对signal()的通话取消注释(现在忽略它被认为更适合使用sigaction()),您会看到Starting消息,大约每两秒发一次Alarm fired消息。

那是因为你正在捕获信号,但是在退出时,它会返回到无限循环内部。

答案 1 :(得分:0)

while (1);

这是一个无限循环。执行永远不会超越这个。