int main()
{
alarm(2);
printf("still going\n");
while (1);
printf("should this line be executed?\n");
}
我知道alarm()会中断执行,将闹钟设置为关闭并将其移回。为什么最后一行没有被执行?
答案 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);
这是一个无限循环。执行永远不会超越这个。