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

Why is the last line not executed by this code?

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

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

while (1);

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

它没有打印出来,因为 while(1); 是一个无限循环。因此,如果没有 alarm() 调用,那将永远 运行。

但是,在您调用 alarm() 两秒后生成的 信号 如果您没有捕捉到它,将导致程序终止。

不会做的只是导致循环退出和程序继续运行。它将关闭程序,快速智能。

如果您 捕获了信号,但您的捕获函数只是returns,它最终会回到无限循环中。

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

#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 大约每两秒发送一次消息。

那是因为你正在捕捉信号,但在退出时,它returns进入了无限循环。