2010-06-27 55 views
9

對此有任何想法?是否有某種信號隊列,還是會丟失?如果在UNIX中進行信號處理期間,會發送相同的信號給程序會發生什麼?

雖然我們在這個問題上,信號處理程序是否應該儘可能減少工作量?

我在某處讀取信號處理程序應該使用管道並只寫一個字節,指示程序應該做什麼。然後程序會在其他地方定期檢查管道,並根據其中的字節進行調度。 (我可能誤解了它)

謝謝,Boda Cydo。

回答

8

要回答您問題的第二部分,「信號處理程序是否應該儘可能少地完成工作?」答案是肯定的,因爲有一組非常小的「異步信號安全」功能,因此可以從信號處理程序中調用。異步信號安全性是重新進入的一種增強形式。如果foo()是異步信號安全的,這意味着在信號處理程序中調用foo()是安全的,即使foo()已經在信號產生時執行。

您可以通過查看signalman 7 signal)的第7部手冊頁獲取異步信號安全功能的完整列表。在信號處理程序中直接或間接調用除這些之外的任何函數都會調用未定義的行爲。

「寫入一個字節到管道」的方法是處理信號的一種很好的方式,而不受限於異步信號安全功能,特別是如果您的程序已經圍繞select循環定向。

7

要回答問題的第一部分,缺省值如下:如果它與當前處理的信號相同,則新信號被阻塞(保持在隊列中)並在處理程序返回時傳遞。如果有其他信號到達,則調用新信號的處理程序。 c.f. the glibc manual

+0

或者如果信號未處理,則採取信號的默認操作 – 2010-06-28 10:39:33

相關問題