1
該方案是爲了避免殭屍分叉兩次。我得到的孤兒過程的父母pid的價值除1之外,這是不正確的。通過殺死父節點而孤兒的子進程沒有被init所採納。我該如何解決?
這是我試過的代碼。如果邏輯中有錯誤,請幫我解決。
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t processid;
if((processid=fork())<0)
printf("Fork error\n");
else if(processid==0)
{
if((processid=fork())<0)
printf("Fork error\n");
if(processid>0)
{exit(0);}
sleep(2);
printf("second child, parent pid =%d\n",getppid());
exit(0);
}
exit(0);
}
這是我得到的輸出:
[email protected]:~# gedit avoidzombies.c
[email protected]:~# gcc avoidzombies.c
[email protected]:~# ./a.out
[email protected]:~# second child, parent pid =1069
檢查在Mac OS 10.10和Ubuntu 14.06lts - 它確實返回了'1' – Vasfed
在我的系統上,我也得到不同的pid - 但該pid對應於新貴,這是init的替代品。所以,它的工作正常,但init(備用)進程的PID不是1. – Dmitri
避免殭屍的方法是正確地「等待()」,讓孩子在父進程中完成 - 派生孩子只需創建第二個Z如果你不這樣做。我懷疑你想要做的是讓'init()'自動處理孫子的收割 - 參見http://stackoverflow.com/questions/8665642/why-do-i-have-to-wait-for-子進程的細節。 (請注意,你的代碼與那個'wait()'調用的例子有很大不同,也是,呃...不這樣做,可能=)) – BadZen