2016-10-31 19 views
1

工作,我想執行這個代碼:報警(INT)並不在一個while循環

signal(SIGALRM,handler); 
alarm(1); 
while(1){} 

handler功能只是打印「測試」。

alarm(1)在這種情況下最終只能執行一次。我試圖把它放在循環中,看起來它根本沒有被執行!

我對信號有點新鮮。有人可以向我解釋這是怎麼發生的?

+1

如果您將呼叫置於循環中的「鬧鐘」,您將不斷將其重置爲1秒,並且永遠不會有機會跑下。如果你想要一個週期性的定時器,你可以看看'setitimer'或'timer_create'。 –

+1

下次考慮提供[MVCE](http://stackoverflow.com/help/mcve)。至少,展示你所問​​的代碼,而不是展示其他代碼,並解釋它與你困惑的代碼有什麼不同......另外,閱讀關於你所詢問的函數的文檔,並提及你如何做的,找到答案有一個好主意。 – hyde

回答

5

如果您在示例中將alarm(1)放在循環中,則在每次調用的幾微秒內就可以無限次地調用alarm(1)。然後this發生:

如果警報已經設置了警報()但尚未交付,另一個警報()的呼叫將取代之前的呼叫。

也就是說,在循環的每次迭代中報警被清除。而且由於你的循環永遠運行,報警永遠不會永久設置。

+3

@downvoter爲什麼downvote?真正有興趣知道答案對我來說似乎很好。 – kaylum

+0

啊哈好!現在我明白了。但是,無論如何發送警報之前還需要等待什麼?我的意思是,爲什麼我們在發送警報之前至少要等待至少一秒? – Elirovi

+2

@Elirovi在現實生活中,自從您已經醒來後,立即設置鬧鐘的要點是什麼?同樣在這裏。警報的整個目的是在晚些時候*喚醒你。 – kaylum