2016-05-15 11 views
3

Das folgende Programm sollte Prozesse Baum der Tiefe K mit N Kinder auf jedem Knoten erstellen.Erstellen eines Prozess-Baums

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

void spawnNodes(int curLevel, int levelLimit, int childrenNumber, 
       int nodeNumber, int offset) 
{ 
    if (curLevel == levelLimit) 
     exit(0); 

    curLevel++; 
    printf("(%d, %d) Pid: %d with parent %d\n", curLevel, nodeNumber, 
      getpid(), getppid()); 

    for (int i = 0; i < childrenNumber; i++) 
    { 
     pid_t childPid = fork(); 
     if (childPid == -1) 
     { 
      perror("Couldn't create process"); 
      exit(1); 
     } 

     if (childPid == 0) 
     { 
      spawnNodes(curLevel, levelLimit, childrenNumber, offset + i, 
         offset + i); 
     } 
     else 
     { 
      wait(NULL); 
     } 
    } 
} 

int main() 
{ 
    int levelLimit, children; 
    scanf("%d %d", &levelLimit, &children); 

    spawnNodes(0, levelLimit, children, 0, 0); 

    return 0; 
} 

Auf den ersten Blick mag es richtig aussehen. Es gibt jedoch ein seltsames Verhalten, das ich nicht verstehe. Der erste Sohn des Prozesses 1 geht beim letzten Sohn 1 Stufe tiefer.

Das ist, was ich meine:

p1--p2---p3--exit(0) 
    \---p4--exit(0) 
     \--p5--p6--exit(0) 

ich diese beim Debuggen in gdb entdeckt haben. Dies ist auch der Ausgang für einen binären Baum der Tiefe 2:

(1, 0) Pid: 5562 with parent 2835 
(2, 0) Pid: 5563 with parent 5562 
(2, 1) Pid: 5566 with parent 5563 
(2, 1) Pid: 5569 with parent 5562 

Was mache ich falsch?

Antwort

2

Was mache ich falsch?

Wenn Sie N Kinder zu einem Prozess nicht über die Erstellung Prozess erstellen möchten wait() nach dem ersten Kind geschaffen zu haben.


Um besser zu verstehen, was diese

if (curLevel == levelLimit) 
    exit(0); 

if (curLevel == levelLimit) 
    pause(); 

Diese Änderung jedes Kind weiterleben wird sein auf Änderung wird lassen, bis es wird ausdrücklich getötet. Dies geschieht nein Anruf an wait() wird im Voraus zurück. Auf diese Weise sehen Sie, dass jeder Elternteil genau ein Kind erstellt.

+0

Jetzt habe ich ein noch seltsameres Verhalten. Werfen Sie einen Blick auf diesen Ausschnitt: http://pastebin.com/uVmJS4gb. Dies ist die Ausgabe: http://pastebin.com/WfC1DeKK. Welches ist kein Baum. Näher an einem Baum als die letzte Version, aber noch kein Baum. – cristid9