int main()
{
alarm(2);
printf("still going\n");
while (1);
printf("should this line be executed?\n");
}
據我所知,alarm()會中斷執行,設置鬧鐘關閉並將其傳回。爲什麼最後一行沒有被執行?爲什麼最後一行沒有被這段代碼執行?
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