定義:
in unix system terminology, a process that has terminated,but whose parent has not yet waited for it, is called a zombie. 在unix 系統中,乙個程序結束了,但是他的父程序沒有等待(呼叫wait / waitpid)他, 那麼他將變成乙個殭屍程序. 但是如果該程序的父程序已經先結束了,那麼該程序就不會變成殭屍程序, 因為每個程序結束的時候,系統都會掃瞄當前系統中所執行的所有程序, 看有沒有哪個程序是剛剛結束的這個程序的子程序,如果是的話,就由init 來接管他,成為他的父程序
那就來看看,怎麼樣能夠產生這種程序吧。
#include
#include
#include
int main()
else
printf("parent process:/n");
printf("pid: %d/n", getpid());
printf("ppid: %d/n", getppid());
printf("uid: %d/n", getuid());
printf("euid: %d/n", geteuid());
printf("gid: %d/n", getgid());
printf("egid: %d/n", getegid());
for(i=0; i<10; i++)
sleep(10);
return 0;
}這段**執行結果:
$./test
child process:
pid: 8732
ppid: 8731
uid: 500
euid: 500
gid: 514
egid: 514
parent process:
pid: 8731
ppid: 14644
uid: 500
euid: 500
gid: 514
egid: 514
顯示父程序和子程序都執行起來了,但是子程序其實已經退出。
那現在來顯示程序狀態。
$ps uwyang | grep test
7835 ? ss 0:01 gvim test.c
8731 pts/53 s+ 0:00 ./test
8732 pts/53 z+ 0:00 [test]
8734 pts/32 s+ 0:00 grep test
看到紅顏色的就是我們的程序。 父程序還活著,而子程序已經是z狀態了,表示已經是殭屍程序了。
過了100秒後,父程序也退出後。
$ps uwyang | grep test
32093 pts/53 s+ 0:00 grep test
可以看到,父程序和子程序都沒有了。
是init接管了子程序,還是父程序清理了呢?
想了想,還是應該init接管,清理掉的。
因為父程序不知道子程序的資訊。
殭屍程序和如何刪除殭屍程序
當乙個子程序結束後,他的父程序沒有等待他 wait waitpid 清除他的所有資源時,它就變成乙個殭屍程序。在linux系統中,在每個程序退出的時候,核心釋放該程序所有的資源,包括開啟的檔案,占用的記憶體等。但是仍然為其保留一定的資訊 包括程序號the process id,退出狀態the ter...
檢視殭屍程序並殺掉殭屍程序
在運維過程中,我們經常會碰到機器由於某幾個特殊的殭屍程序造成整台伺服器上的程序異常卡死,負載變高。例如以下 其中,存在8個殭屍程序,並且程序19712的cpu使用異常。檢視具體的殭屍程序有哪些 發現這些子殭屍程序的父程序即為19712程序。其對應的其實就是namenode程序 解決辦法 1 如果業務...
Defunct程序 殭屍程序
下面談談 defunct 程序,中文翻譯叫殭屍程序。下文整理於網路以及apue一書。一 什麼是殭屍程序 在unix 系統中,乙個程序結束了,但是他的父程序沒有等待 呼叫wait waitpid 他,那麼他將變成乙個殭屍程序。當用ps命令觀察程序的執行狀態時,看到這些程序的狀態列為defunct。殭屍...