2012-12-04 47 views
3

在Linux 2.6中,我希望我的進程能夠同時捕獲SIGHUP和SIGTERM以便順序退出。大約在同一時間處理2個信號

當節點關閉時,日誌顯示它將首先處理SIGHUP(父進程接收到SIGTERM)或SIGTERM。

我的問題是:這些信號的處理程序是否可能被同時調用?或者內核觸發一個接一個?

+1

關於第一個問題,我認爲你不能那樣做。但關於第二個問題,你可以在SIGHUP的處理程序中進行加號(SIGTERM),反之亦然。當然,你應該檢查你是不是來到另一個處理程序。 – banuj

+0

澄清:進程在關閉時接收到SIGHUP和SIGTERM,因爲它們由於關閉而收到SIGTERM,並且因爲父進程也會死機。 –

回答

0

根據您的代碼架構,您可以強制同步讀取信號以防止出現任何併發問題。您可以使用signalfd,然後在您想檢查任何未完成信號時從該fd讀取。如果你需要他們表現在他們的異步默認與信號處理程序我認爲你必須準備好你的信號處理程序可能被打斷。

man signalfd

0

在異步信號的處理,Linux內核發送信號與系統調用目標方法的結構和當該方法的上下文中被切換到運行狀態,信號由根螺紋和塊信號處理在所有其他線程上。由於每個線程的堆棧空間不同,每個信號可以一次處理(如果錯誤,請更正)。

+0

我沒有使用線程。 –

+0

@AndresVelascoGarcia如果是過程,不應該從信號處理程序按順序讀取內核中的每個信號。如果錯了,糾正我。 –