2015-02-11 199 views

回答

1

它没有打印,因为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消息大约每两秒钟。

这是因为你捕捉信号,但在退出时,它返回到无限循环内。

+0

感谢您的详细解释 – 2015-02-11 01:34:17

0
while (1); 

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

+0

但如果程序永远不会到达块的底部,程序将如何终止? – 2015-02-11 00:26:22

+0

如果你有一段时间(1),它永远不会终止。 – brokenfoot 2015-02-11 00:27:55

+0

它不会,这是问题所在。你有什么意图把它放在那里? – Carcigenicate 2015-02-11 00:28:26