2015-07-06 4 views
8

Ich bin total neu in C. Ich habe den folgenden Code ausprobiert, in der Erwartung, dass das Kind mit dem Pid der Eltern übereinstimmen würde, aber das ist nicht der Fall.c fork's kind ppid stimmt nicht mit dem pid der Eltern überein

int main() { 


    int pid; 

    printf("I'm process with pid=%d\n", getpid()); 

    switch (pid = fork()) { 
     case -1: 
      perror("fork"); 
      exit(1); 
     case 0: 
      printf("I'm the child process: pid=%d, ppid=%d\n", getpid(), getppid()); 
      break; 
     default: 
      printf("I'm the parent process: pid=%d, ppid=%d\n", getpid(), getppid()); 
      break; 
    } 

    exit(0); 

} 
> gcc -o fork fork.c 
> ./fork 
I'm process with pid=16907 
I'm the parent process: pid=16907, ppid=6604 
I'm the child process: pid=16908, ppid=1 // <-- expected ppid=16907, why 1? 
> 

Was habe ich falsch gemacht?

+2

Der übergeordnete Prozess wird beendet, bevor der untergeordnete Prozess "getppid" aufrufen kann. Also das Kind Prozess Zombies und seine Eltern ist der Root-Prozess (1) – WhozCraig

+0

Ehrfürchtig, das ist es! Ich habe den Schlaf (1) kurz vor dem Ausgang hinzugefügt und es hat funktioniert, danke. – ling

+0

Es wäre besser für die Eltern zu warten() bis das Kind fertig ist - es wird weniger Verzögerung geben. Aber 'sleep (1)' funktioniert auch. –

Antwort

8

Es ist wahrscheinlich, dass der Elternprozess bereits beendet wurde und nicht mehr existiert. Sie könnten eine Verzögerung im Elternteil versuchen.

1

'init' was ist der Root-Prozess läuft in einem Linux-System hat pid 1.

Wenn ein Elternteil eines Prozesses vor sich selbst beendet wird (dh das Kind), wird das Kind zu einem 'Orphan' Prozess und wird vom Root-Prozess oder dem Prozess direkt über der Hierarchie des Prozesses, der es erstellt hat, übernommen (Elternprozess).

Daher wird hier von init übernommen und ausgeführt, die pid = 1 hat. Also, verzögern Sie Ihren Elternprozess zur Lösung.