古詩詞大全網 - 成語故事 - 如何避免出現僵屍進程

如何避免出現僵屍進程

如何避免出現僵屍進程

 所謂僵屍進程,就是指子進程結束後,其實並沒有真正被銷毀,而是留下壹個稱為僵屍進程(Zombie)的數據結構,它幾乎放棄了所有內存空間,沒有任何可執行代碼,也不能被調度,僅僅在進程列表中保留壹個位置,記載進程的'退出狀態等供其他進程搜集,此時即使用root身份kill -9也不能將其殺死,此時唯壹的補救辦法就是找到它的父進程,並將其殺死,此時僵屍進程過繼給init,由init負責回收。那麽怎樣用兩次fork來避免僵屍進程呢

 #include

 #include

 #include

 #include

 #include

 int main()

 {

 pid_t pid;

 pid=fork();

 if(pid<0)

 {

 perror("child1 create failed\n");

 exit(-1);

 }

 else if(pid==0)

 {

 /*child1*/

 pid=fork();

 if(pid<0)

 {

 perror("child2 create failed\n");

 exit(-1);

 }

 else if(pid>0)

 {

 /*child1結束*/

 exit(0);

 }

 /*child2*/

 sleep(2);//因為不知道child1和child2哪個先執行,所以讓child2先睡兩秒

 /*TODO child2*/

 exit(0);

 }

 /*parent*/

 if(waitpid(pid,NULL,0)!=pid) //wait for child1

 {

 perror("waitpid error\n");

 exit(-1);

 }

 /*TODO parent*/

 exit(0);

 }

 總的說來,其實就是父進程parent創建壹個子進程child1,child1再創建它的子進程child2,此時結束child1,child2就自然過繼給init啦,這樣以後無論怎樣,當child2結束時直接就由init釋放,再也影響不到parent進程了,也不可能會出現僵屍進程啦 ;