SIGCHLD信號與SIG_IGN處理的使用
Posted on 2009-01-04 19:06 Prayer 閱讀(1590) 評論(0) 編輯 收藏 引用 所屬分類: LINUX/UNIX/AIX今天查一下問題,查了很久,終于解決了。有一些心得與大家分享。
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來接收此子進程的處理。