Posted on 2009-01-04 19:06
Prayer 閱讀(1597)
評(píng)論(0) 編輯 收藏 引用 所屬分類:
LINUX/UNIX/AIX
今天查一下問題,查了很久,終于解決了。有一些心得與大家分享。
signal(SIGCHLD, SIG_IGN); //忽略SIGCHLD信號(hào),這常用于并發(fā)服務(wù)器的性能的一個(gè)技巧
//因?yàn)椴l(fā)服務(wù)器常常fork很多子進(jìn)程,子進(jìn)程終結(jié)之后需要
//服務(wù)器進(jìn)程去wait清理資源。如果將此信號(hào)的處理方式設(shè)為
//忽略,可讓內(nèi)核把僵尸子進(jìn)程轉(zhuǎn)交給init進(jìn)程去處理,省去了
//大量僵尸進(jìn)程占用系統(tǒng)資源。(Linux Only)
some code();
pid = fork(); //生成一個(gè)子進(jìn)程
if (pid < 0) // error check.
handle_err();
if (pid == 0)
exit (execl(....)); // child process.
else
if (wait(&ret) < 0)
perror("wait"); //parent process
//在這里wait,都會(huì)得No Such process的錯(cuò)誤,
//因?yàn)樽舆M(jìn)程終止后,內(nèi)核會(huì)向父進(jìn)程發(fā)送SIGCHLD
//信號(hào),但是上面已將此信號(hào)設(shè)為忽略,實(shí)質(zhì)上由
//init來接收此子進(jìn)程的處理。