2016-03-16 39 views
1

我有幾個信號處理程序用於乾淨地退出我的程序,並且我想通過鏈接信號處理程序調用很好地與任何其他已掛鉤的信號處理程序搭配使用。我正在使用sigaction來查看信號,說它不再是首選。在linux中鏈接信號處理程序的正確方法?

看看sigaction結構,有指定的信號掩碼等,以及幾個標誌。什麼是「正確」的方式來調用當前安裝的處理程序,以便將所有這些選項都考慮在內?

回答

1

答案是「這取決於」:什麼信號處理程序

  • 從衆多的第一反應將是一個信號處理程序將被用於處理SIGINT等,乾淨地終止程序。
  • 另一方面,有(或多或少)良性信號,如SIGWINCH(您希望不是停止您的程序)。

在「乾淨地終止程序」,有可能不是空間供其他程序做一些有用的東西。例如,建議的鏈處理程序可能會關閉您依賴的文件。所以你必須先從其他處理程序的知識入手。

如果信號處理程序在後一類中,只需更新應用程序可以測試的變量,那麼信號處理函數函數只是另一個函數。當您致電signal將信號與函數相關聯時,該函數返回前一個處理函數(可能是其中一個幻數值,例如。SIG_DFL,SIG_IGN)。如果你保存它,可以檢查它是否都不是,並且(可能)是真正的功能。調用函數將繼續執行,就好像它是當前信號處理程序的一部分。

這並不是一個新的想法(我用它在90年代末),並偶爾討論:

,當然還有:

0

好吧,IMO的正確答案是「不要那麼做」。我想你應該重新考慮一下,如果你打算連鎖信號處理程序。

基本上,如果你有一些如此重要的事情,即使一個致命的信號到來,也必須清理乾淨,那麼你應該快速完成這部分,並在讓其他代碼運行之前重置信號處理程序。

SIGTERM和SIGQUIT等信號應該以正常方式終止程序的事件處理。通常情況下,您的信號處理程序會在管道上寫入消息以發送應用程序中的正常事件循環,或者如果您沒有事件循環,則會設置全局變量。

也許你知道這一點,但也請確保閱讀可以從信號處理程序調用的函數列表。它應該在手冊頁中。除了該列表以外的任何內容都不安全。

+0

不這樣做是理想的,但如:對SIGINT我不得不關機乾淨到如:他們等待子進程退出並等待(),所以它們不會成爲孤兒。如果我使用SIGCHLD來等待自己的進程關閉,並且我使用Qt(例如),不調用它的SIGCHLD處理程序將會中斷QProcess,所以肯定有這樣做的理由,但是沒有顯然是「好」的方法它強勁。 –

+0

SIGINT絕對屬於「信號主要事件循環」類別的信號。你不應該在處理程序中做任何處理。 –

+0

對於SIGCHLD,我認爲它更復雜。我不是那種信號的粉絲,通常嘗試處理孩子而不依賴它(例如,文件描述符上的EOF也可以表示孩子出口)。 –

相關問題