C語言開發之中斷處理遇上system

近期在debug一下signal丟失的問題發現在中斷處理函數中調用system()啓動進程會造成啓動的進程收不到某些signal的現象,原因是:

1 根據LINUX的信號 處理機制,我們知道爲妨止在處理信號的過程中又來重複信號造成信號丟失,會採取屏蔽正在處理的信號標誌位,以讓重複信號排隊;在處理完上一個信號後,再打 開標誌位,接着處理重複信號。所以在中斷處理函數裏面,當前正在處理的信號(假設爲X)是被屏蔽的。

2 LINUX~在派生進程時,存在繼承父進程信號屏蔽標識的現象,所以在中斷中調用system()啓動的進程會繼承屏蔽的信號,從而造成新啓動的進程收不到X信號。

之前在某個案子上發生過有個進程(暫且稱之爲A進程)很詭異,開機啓動的時候能正常的收到USR1的signal,但run一段時間之後就收不到了,然後重啓問題消失,當時有下過一個work-around就是換個signal用,但最後查下來的根本原因就與這個相關:

     開機啓動的時候A進程並未屏蔽USR1,但在運行過程中,我們注意到A進程會被重啓,而重啓的動作恰好是在B進程的一個信號處理函數裏面,而這個信號處理函數對應的信號正是USR1,所以在這種狀態下啓動的A進程就天然屏蔽了USR1的信號

結論: 一般LINUX編程建議,不要在中斷中處理過於複雜的事情, 後續大家在寫中斷處理函數是要特別注意,特別是避免在中斷處理函數裏調用system()啓動新的進程。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章