2009-12-22 62 views
2

我想在perl中編寫一個健壯的守護進程,它將在Linux上運行,並遵循in this excellent answer描述的模板。不過,我的情況有一些差異:首先我使用Parallel::ForkManagerstart() and next;到餐桌上,緊接着exec('handle_event.pl')管理fork()的守護進程的信號處理

在這種情況下的事件,我有以下問題:

  1. 我應該在哪裏定義我的信號處理程序。我應該在父進程(守護進程)中定義它們並假定它們將在子進程中被繼承嗎?
  2. 如果我運行exec('handle_event.pl')處理程序會通過exec繼承(我知道它們是通過fork繼承的)?
  3. 如果我在handle_event.pl中重新定義一個新的信號處理程序,這個定義是否會覆蓋父定義的定義?
  4. 這種情況下的最佳做法是什麼?

謝謝

回答

4

exec替換將要執行的代碼的整個過程的代碼。由於信號處理程序是過程映像中的代碼,因此它們不能通過exec繼承,因此exec會將已處理信號的信號處理設置重置爲其默認狀態(忽略的信號將保持忽略)。因此,啓動時您需要在exec ed過程中安裝任何信號處理。

+0

謝謝。這是非常有幫助和清晰的 –

+3

並非所有的信號都將被設置爲默認值,如果信號被忽略,它將在exec後仍然被忽略。 – gorilla

+0

@gorilla:謝謝!答覆修正。 – JaakkoK

5

當您fork時,子進程與父進程具有相同的信號處理程序。當你執行時,任何被忽略的信號都會被忽略;任何處理過的信號都會重置回默認處理程序。

+0

謝謝 - 這是我希望接受多於一個答案的時間之一:) –