我正在研究使用sigprocmask
來阻止特定信號(在這種情況下,SIGALRM
和SIGCHLD
),當執行一段關鍵的代碼段時。與這些信號相關聯的兩個信號處理程序都將訪問和修改中央數據結構,所以當主進程正在處理它時,阻止它們訪問它是至關重要的。信號執行期間sigprocmask
目前,我的計劃是在代碼的關鍵部分開始時簡單地禁用這些信號,然後在最後重新啓用它們。
void criticalFunction(void) {
// disable signals with sigprocmask
// critical code
// enable signals with sigprocmask
}
但是,信號處理程序對於將被阻止的信號也會呼叫criticalFunction
。當他們調用sigprocmask
函數並啓用自己的信號阻塞時會發生什麼?他們會失速還是繼續執行? (或第三個條件。)
唯一要注意的我能夠找到的有關這個如下:
如果sigprocmask()執行被稱爲一個信號處理程序,從 處理程序返回可以撤銷sigprocmask()通過恢復原始的 未決信號掩碼的工作。 (http://www.mkssoftware.com/docs/man3/sigprocmask.3.asp)
(這是一個後續問題我剛纔的問題:Signal handler accessing queue data structure (race condition?))
POSIX定義了在信號處理程序中執行某些操作的行爲,並且您可以執行相當多的操作。這只是非POSIX,普通的C環境,你無法在信號處理程序中做任何事情,並且在這樣的環境中,無論如何都沒有有用的信號,對於信號處理程序來說沒有用處...... –
@ R:是的確,所有的「異步信號安全」功能都可以。特別是,您可以更改信號處理程序內的信號掩碼和其他與信號有關的東西。但就一般用戶代碼而言,最好不要使用信號處理程序。否則,你必須證明你所做的每一件事情都是異步信號安全的,而且這可能是非本地的,很難做到。 –
如果您知道異步信號不安全的功能未被信號處理程序中斷,您可以自由地從信號處理程序調用**任何**功能。如果您仔細地屏蔽並揭露信號,即使在多線程代碼中,也很容易確保這一點。 –