apue的**直接貼這裡。
這段**採用了兩次fork,來避免產生殭屍程序。
當乙個程序的父程序先退出,該程序就由init程序接管。init程序就成為了該程序的父程序 。
該程序退出時,有init來清理。所以該程序就不會成為殭屍程序了。
#include
#include
#include
#include
intmain(void)
else if (pid == 0)
/** we're the second child; our parent becomes init as soon
* as our real parent calls exit() in the statement above.
* here's where we'd continue executing, knowing that when
* we're done, init will reap our status.
*/printf("son: %d/n", getpid());
sleep(50);
printf("second child, parent pid = %d/n", getppid());
exit(0);
}if (waitpid(pid, null, 0) != pid) /* wait for first child */
perror("waitpid error");
printf("parent exit/n");
/** we're the parent (the original process); we continue executing,
* knowing that we're not the parent of the second child.
*/exit(0);
}來看一下輸出結果。
$ps uwyang -o cmd,pid,ppid| grep test
gvim test.c 18593 1
./test 23360 7088
./test 23361 23360
./test 23362 23361
grep test 23364 14644
剛開始,三個程序都存在,父子關係很明確。
當程序23361退出後,
$ps uwyang2 -o cmd,pid,ppid| grep test
gvim test.c 18593 1
./test 23362 1
grep test 25295 14644
程序23362的父程序就是1了。
防止殭屍程序的方法
1.每次執行fork 前利用waitpid檢視是否有子程序需要處理 2.呼叫signal sigchld,fun 註冊訊號處理函式,在函式裡呼叫waitpid void fun int 3.利用 sigaction 結構體 struct sigaction act,oldset 設定訊號性質的結構體...
殭屍程序的產生原因
在linux系統中,殭屍程序是已經執行完畢,但是沒有被父程序 的子程序。判斷殭屍程序的乙個方法是使用ps命令檢視程序狀態。如果程序狀態是z,說明這是乙個殭屍程序。在多程序的程式中,父程序會啟動若干個子程序來處理任務。當子程序退出後,除了在程序表中占用的乙個程序表項,子程序所使用的資源 檔案描述符 記...
mysql殭屍程序 殭屍程序產生原因和解決方法
在linux系統中,當用ps命令觀察程序的執行狀態時,經常看到某些程序的狀態列為defunct,這就是所謂的 殭屍 程序。殭屍 程序是乙個早已死亡的程序,但在程序表 processs table 中仍佔了乙個位置 slot 由於程序表的容量是有限的,所以,defunct程序不僅占用系統的記憶體資源,...