在UNIX 系統中,一個子進程結束了,但是他的父進程沒有等待(調用wait / waitpid)他, 那麼這個子進程將變成一個僵屍進程。 但是如果該進程的父進程已經先結束了,那麼該進程就不會變成僵屍進程, 因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程, 看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init (進程號為1)來接管他,成為他的父進程,此時稱這個進程為孤兒進程,其狀態收集工作由init進程負責。
以下是僵屍進程的示例程序,在此程序中,父進程讓子進程退出但不處理,然後父進程調用system函數列出當前前台進程信息,其源代碼如下:
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
pid_t pid;
if((pid=fork)==-1)
perror("fork");
else if(pid == 0) {
printf("child_pid pid=%d,ppid=%d\n",getpid());//打印pid
exit(0);
}
sleep(3);
system("ps");
exit(0)
}
以上程序的編譯運行結果為:
child_pid pid=1108
PID TTY TIME CMD
847 pts/1 00:00:00 bash
1107 pts/1 00:00:00 a.out
1108 pts/1 00:00:00 a.out<defunct>
1109 pts/1 00:00:00 ps摘自 日新為道的專欄