在UNIX 系統中,一個子進程結束了,但是他的父進程沒有等待(調用wait / waitpid)他, 那麼這個子進程將變成一個僵屍進程。 但是如果該進程的父進程已經先結束了,那麼該進程就不會變成僵屍進程, 因為每個進程結束的時候,系統都會掃描當前系統中所運行的所有進程, 看有沒有哪個進程是剛剛結束的這個進程的子進程,如果是的話,就由Init (進程號為1)來接管他,成為他的父進程,此時稱這個進程為孤兒進程,其狀態收集工作由init進程負責。
以下是一個孤兒進程的示例程序,在此程序中,讓父進程先退出,然後子進程再次打印自己的父進程號:
view plain
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
main()
{
pid_t pid;
if((pid=fork)==-1)
perror("fork");
else if(pid == 0) {
printf("pid=%d,ppid=%d\n",getpid(),getppid());//打印pid,ppid
sleep(2);//休眠以讓父親進程先退出
printf("pid=%d,ppid=%d\n",getpid(),getppid());//打印pid,ppid
}
else exit(0);
}
注:getpid函數可以獲得當前進程的pid,getppid函數可以獲得當前進程的父進程號。
以上程序編譯運行後的輸出為:
pid=1091,ppid=1090
pid=1091,ppid=1.
可以看出子進程1091後來被init進程接管(pid=1).
摘自 日新為道的專欄