为什么最后一行没有被这段代码执行?
int main()
{
alarm(2);
printf("still going\n");
while (1);
printf("should this line be executed?\n");
}
据我所知,alarm()会中断执行,设置闹钟关闭并将其传回。为什么最后一行没有被执行?为什么最后一行没有被这段代码执行?
它没有打印,因为while(1);
是一个无限循环。所以,在没有alarm()
电话的情况下,这将永远运行。
然而,所产生的信号2秒你打电话后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
消息大约每两秒钟。
这是因为你是捕捉信号,但在退出时,它返回到无限循环内。
感谢您的详细解释 – 2015-02-11 01:34:17
while (1);
这是一个无限循环。执行永远不会超越此。
但如果程序永远不会到达块的底部,程序将如何终止? – 2015-02-11 00:26:22
如果你有一段时间(1),它永远不会终止。 – brokenfoot 2015-02-11 00:27:55
它不会,这是问题所在。你有什么意图把它放在那里? – Carcigenicate 2015-02-11 00:28:26
因为1永远不会评价为假? – msfoster 2015-02-11 00:23:59