2016-05-24 62 views
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 
+0

檢查在Mac OS 10.10和Ubuntu 14.06lts - 它確實返回了'1' – Vasfed

+1

在我的系統上,我也得到不同的pid - 但該pid對應於新貴,這是init的替代品。所以,它的工作正常,但init(備用)進程的PID不是1. – Dmitri

+2

避免殭屍的方法是正確地「等待()」,讓孩子在父進程中完成 - 派生孩子只需創建第二個Z如果你不這樣做。我懷疑你想要做的是讓'init()'自動處理孫子的收割 - 參見http://stackoverflow.com/questions/8665642/why-do-i-have-to-wait-for-子進程的細節。 (請注意,你的代碼與那個'wait()'調用的例子有很大不同,也是,呃...不這樣做,可能=)) – BadZen

回答

0

在我的系統,我也得到一個不同的PID - 但PID對應的新貴,這是一個init更換。所以,它的工作正常,但init(替代)進程的PID不是1. - Dmitri

相關問題