工作,我想執行這個代碼:報警(INT)並不在一個while循環
signal(SIGALRM,handler);
alarm(1);
while(1){}
的handler
功能只是打印「測試」。
alarm(1)
在這種情況下最終只能執行一次。我試圖把它放在循環中,看起來它根本沒有被執行!
我對信號有點新鮮。有人可以向我解釋這是怎麼發生的?
工作,我想執行這個代碼:報警(INT)並不在一個while循環
signal(SIGALRM,handler);
alarm(1);
while(1){}
的handler
功能只是打印「測試」。
alarm(1)
在這種情況下最終只能執行一次。我試圖把它放在循環中,看起來它根本沒有被執行!
我對信號有點新鮮。有人可以向我解釋這是怎麼發生的?
如果您在示例中將alarm(1)
放在循環中,則在每次調用的幾微秒內就可以無限次地調用alarm(1)
。然後this發生:
如果警報已經設置了警報()但尚未交付,另一個警報()的呼叫將取代之前的呼叫。
也就是說,在循環的每次迭代中報警被清除。而且由於你的循環永遠運行,報警永遠不會永久設置。
如果您將呼叫置於循環中的「鬧鐘」,您將不斷將其重置爲1秒,並且永遠不會有機會跑下。如果你想要一個週期性的定時器,你可以看看'setitimer'或'timer_create'。 –
下次考慮提供[MVCE](http://stackoverflow.com/help/mcve)。至少,展示你所問的代碼,而不是展示其他代碼,並解釋它與你困惑的代碼有什麼不同......另外,閱讀關於你所詢問的函數的文檔,並提及你如何做的,找到答案有一個好主意。 – hyde