2015-02-11 214 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

相關問題