背景知識:
子進程先于父進程結束時,會給父進程發送SIGCHLD信號
如果
??????????????????????????????????????????????????????????????????? 1、父進程沒有忽略SGICHLD信號;
???????????????????????????????????????????????????????????????????? 或者
??????????????????????????????????????????????????????????????????? ?2、父進程沒有調用wait或waitpid函數。
????????????????????????????????????????????????????????? 那么子進程將僵死。
?????????????????????????????????????????????????????????
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? (
????????????????????????????????????????????????????????????????在2.6內核,只要父進程顯式忽略了SIGCHLD信號,
????????????????????????????????????????????????????????????????那么子進程將不會僵死,那么system將得不到子進程的退出狀態。
???????????????????????????????????????????????????????????????? 也就是說system函數的返回值并不是子進程退出時的狀態。
?
?????????????????????????????????????????????????????????????????而2.4內核,只要父進程沒有調用wait系列函數,子進程就將僵死。
?????????????????????????????????????????????????????????????????????????????????????不論是否忽略了SIGCHLD信號。
????????????????????????????????????????????????????????? )
如果,我們在我們的server中需要調用system來調用外部腳本或程序來執行某寫工作。
?
????????int?? ret?? =??? system(command);????
??????? if( ret?== 0)
??????? {
????????????????????????????? //成功
????????}??
??????? else
???????? {
???????????????????????????? //失敗
???????? }
?
其中ret用來接收子進程退出是的返回值。即exit的返回值。
????????但是由于在deamon中忽略了SIGCHLD信號,所以主進程將不再接收子進程的返回值。所以,ret的值不能正確反映子進程的退出狀態。
?
????????正確的做法是::
? ? ? ? ? ? ? ? sighandler_t old_handler;
????????????????old_handler?=?signal(SIGCHLD,SIG_DFL);??????????????? //為了準確地獲取 system 函數的返回值,不能顯式(SIG_IGN)地忽略 SIGCHLD 信號
??????????????? system(command);? ? ? ? ? ? //system 函數:1.fork一個進程;2.在子進程中調用 exec() 去執行新程序;3.在父進程中調用 waitpid 去等待子進程結束
??????????????? signal(SIGCHLD,old_handler);? ? ? ? //old_handler?記錄了之前對于 SIGCHLD 信號的處理方式,現在還原回去
?
2、system相關問題::
???????? system函數其實是調用fork,exec,waitpid來實現的。
????? ????????1、fork一個進程;
??????????????2、在子進程中調用exec去執行新程序。
????????????? 3、在父進程中調用waitpid去等待子進程結束。
?????? 如果在父進程已經signal(SIGCHLD,SIG_IGN);那么子進程結束時,子進程的返回值不能被waitpid接收。
?????? 這個是必須關注的問題。
原文地址:http://www.360doc.com/content/14/0305/09/13084517_357841525.shtml