SIGCHLD訊號與SIG IGN處理的使用

2021-06-27 02:48:22 字數 816 閱讀 4855

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);

這樣,核心在子程序結束時不會產生殭屍程序。

訊號 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....