SIGCHLD訊號處理

2021-07-23 17:38:45 字數 1078 閱讀 2636

在apue這本書中,介紹了早期system v不可靠訊號中sigcld的經典語義。如在rh7.2上編譯並執行該程式則一切正常(不會出現重複列印"sigcld received"),

因為: 

1)現今的unices系統(包括linux)都提供了可靠的訊號機制. 

2)linux(rh7.2,kernel 2.4.7)上對sigcld的處理是: #define sigcld sigchld. 

btw: 現在的程式大都使用sigchld(posix也是採用的該訊號),而不用sigcld.

早期system v訊號的乙個問題是:捕捉到乙個訊號後,系統將對該訊號的處理設為預設.因此很多的signal handler都這樣寫: 

sig_***() 

即便這樣,如果在執行這句signal前又有乙個sig***產生,那麼系統仍會按預設處理(i.e., 忽略該訊號, 或終止該程序, etc.),有可能造成訊號丟失. apue還介紹了另乙個問題(請參考section 10.4)

apue上sigcld語義寫的有點不清楚,到底我們的系統是如何來處理sigcld訊號呢? 

1.sig_dfl :預設的處理方式是不理會這個訊號,但是也不會丟棄子進行狀態,所以如果不用wait,waitpid 對其子進行進行狀態資訊**,會產生殭屍程序。 

2.sig_ign :忽略的處理方式,這個方式和預設的忽略是不一樣的語意,暫且我們把忽略定義為sig_ign,在這種方式下,子程序狀態資訊會被丟棄,也就是自動**了,所以不會產生殭屍程序,但是問題也就來了,wait,waitpid卻無法捕捉到子程序狀態資訊了,如果你隨後呼叫了wait,那麼會阻塞到所有的子程序結束,並返回錯誤echild,也就是沒有子程序等待。 

3.自定義處理方式:sigcld會立即檢查是否有子程序準好被等待,這便是sigcld最大漏洞了,一旦在訊號處理函式中加入了訊號處理方式重建的步驟,那麼每次設定sigcld處理方式時,都會去檢查是否有訊號到來,如果此時訊號的確到來了,先是呼叫自定義訊號處理函式,然後是呼叫訊號處理方式重建函式,在重建配置的時候,會去檢查訊號是否到來,此時訊號未被處理,會再次觸發自定義訊號處理函式,一直迴圈。所以在處理sigcld時,應該先wait處理掉了訊號資訊後,再進行訊號處理方式重建signal。

訊號 SIGCHLD訊號

1.sigchld簡介 sigchld的產生條件 注意 通過signal sigchld,sig ign 通知核心對子程序的結束不關心,由核心 如果不想讓父程序掛起,可以在父程序中加入一條語句 signal sigchld,sig ign 表示父程序忽略sigchld訊號,該訊號是子程序退出的時候向...

SIGCHLD訊號與SIG IGN處理的使用

signal sigchld,sig ign 忽略sigchld訊號,這常用於併發伺服器的效能的乙個技巧 因為併發伺服器常常fork很多子程序,子程序終結之後需要 伺服器程序去wait清理資源。如果將此訊號的處理方式設為 忽略,可讓核心把殭屍子程序轉交給init程序去處理,省去了 大量殭屍程序占用系...

SIGCHLD訊號與SIG IGN處理的使用

signal sigchld,sig ign 忽略sigchld訊號,這常用於併發伺服器的效能的乙個技巧 因為併發伺服器常常fork很多子程序,子程序終結之後需要 伺服器程序去wait清理資源。如果將此訊號的處理方式設為 忽略,可讓核心把殭屍子程序轉交給init程序去處理,省去了 大量殭屍程序占用系...