2011-05-06 77 views
7

這似乎是一個愚蠢的問題,但我無法在任何地方找到答案。我知道在UNIX中,信號是異步處理的。如果我編寫處理信號的函數,那麼函數在哪裏運行?是否有新的線程產生?某個現有的線程以某種方式中斷?或者,這是在像異步I/O是系統線程處理?在Linux中如何處理異步信號?

回答

2

現有的進程線程被中斷,直到函數返回。對於確保它不會破壞線程處於中間位置的函數調用狀態,有一些嚴格的限制,特別是它調用的線程可能已經調用的任何函數都必須是異步可重入的。請參閱手冊頁,例如信號,進一步的細節sigaction或如果你喜歡問更具體的問題。

6

執行信號函數就好像進程中的線程已被中斷一樣。也就是說,使用信號線程調用信號處理程序,並重新安排堆棧,以便在信號處理程序返回線程時繼續執行。沒有新的線程被引入。

2

這不是一個單獨的線程,但您的代碼是匆忙暫停。這就是爲什麼只有有限的POSIX調用子集可用。

signal man page

的常規處理程序必須非常小心,因爲其他地方處理某任意點被中斷。 POSIX具有「安全功能」的概念。如果信號中斷不安全的函數,並且處理程序調用不安全的函數,那麼行爲是不確定的。安全功能在各種標準中明確列出。