防止殭屍程序的產生

2021-05-23 04:49:20 字數 1491 閱讀 3573

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程序不僅占用系統的記憶體資源,...