signal(sigchld, sig_ign); //忽略sigchld訊號,這常用於併發伺服器的效能的乙個技巧
//因為併發伺服器常常fork很多子程序,子程序終結之後需要
//伺服器程序去wait清理資源。如果將此訊號的處理方式設為
//忽略,可讓核心把殭屍子程序轉交給init程序去處理,省去了
//大量殭屍程序占用系統資源。(linux only)
some code();
pid = fork(); //生成乙個子程序
if (pid < 0) // error check.
handle_err();
if (pid == 0)
exit (execl(....)); // child process.
else
if (wait(&ret) < 0)
perror(/"wait/"); //parent process
//在這裡wait,都會得no such process的錯誤,
//因為子程序終止後,核心會向父程序傳送sigchld
//訊號,但是上面已將此訊號設為忽略,實質上由
//init來接收此子程序的處理。
對於某些程序,特別是伺服器程序往往在請求到來時生成子程序處理請求。如果父程序不等待子程序結束,子程序將成為殭屍程序(
zombie
)從而占用系統資源。如果父程序等待子程序結束,將增加父程序的負擔,影響伺服器程序的併發效能。在
linux
下可以簡單地將
sigchld
訊號的操作設為
sig_ign
。signal(sigchld,sig_ign);
這樣,核心在子程序結束時不會產生殭屍程序。這一點與
bsd4
不同,bsd4
下必須顯式等待子程序結束才能釋放殭屍程序。
訊號 SIGCHLD訊號
1.sigchld簡介 sigchld的產生條件 注意 通過signal sigchld,sig ign 通知核心對子程序的結束不關心,由核心 如果不想讓父程序掛起,可以在父程序中加入一條語句 signal sigchld,sig ign 表示父程序忽略sigchld訊號,該訊號是子程序退出的時候向...
system呼叫與SIGCHLD訊號
很多時候,我們需要通過system這個函式在程式內部來執行系統命令。比如 int rv system mount mnt hgfs 最近有同事發現system呼叫返回 1,但事實上外部命令已成功執行。經調查發現,原來是server在啟動後將自己設定為daemon時,遮蔽了sigchld訊號導致的。在...
SIGCHLD訊號處理
在apue這本書中,介紹了早期system v不可靠訊號中sigcld的經典語義。如在rh7.2上編譯並執行該程式則一切正常 不會出現重複列印 sigcld received 因為 1 現今的unices系統 包括linux 都提供了可靠的訊號機制.2 linux rh7.2,kernel 2.4....