2017-04-10 5 views
0
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main() 
{ 
    pid_t pid1, pid2, pid3, pid4; 
    pid1=fork(); 

    if (pid1!=0) { 
     pid2=fork(); 
     pid3=fork(); 
    }else { 
     pid4=fork(); 
    } 
    return 0; 
} 

Hallo, Der folgende Code führt 4 Gabeln. Zuerst führt der ursprüngliche Prozess (Lets rufe es P0) die "pid1 = fork()" aus und erzeugt ein Kind (Lasst es P1 rufen). Dann führt der ursprüngliche Prozess erneut pid2 = fork() aus und erstellt ein weiteres Kind (nennen wir es P2). Dann führen sowohl P2 als auch P0 "pid3 = fork()" aus. Das P0 erzeugt also ein drittes Kind (Nennen Sie es P3) und das P2 wird ein Elternteil und erzeugt ein Kind (nennen Sie es P4). Und am Ende, in der else-Anweisung, erstellt das allererste Kind (P1) ein Kind (P5). So ist der Baum wie:mehrere Gabel() in c-Programm

    P0 
       P1 P2 P3 
      P5  P4 

Meine Frage ist: Bin ich richtig oder nicht? Vielen Dank im Voraus.

+2

Verwenden Sie Ihren Debugger und/oder fügen Sie einige Debug 'printf's und überprüfen Sie es selbst - Sie werden viel mehr auf diese Weise lernen. –

+0

Ist das nicht pid2 = fork(); zweimal zurückgeben (Eltern und Kind), also pid3 = fork90; wird zweimal ausgeführt. –

+0

@DavidZimmerman Ja, das ist was der Fragesteller sagt und warum die Zahlen in seinem Baumdiagramm auf 5 gehen. – JeremyP

Antwort

0

Meine Frage ist: Bin ich richtig oder nicht?

Ja.

Als Paul R sagt in den Kommentaren, versuchen einige printf der Putten. Zum Beispiel nach

pid1 = fork() 

Versuchen

printf("pid %d: pid1 = fork(), result = %d\n", getpid(), pid1); 

getpid() bekommt die pid des aktuellen Prozesses setzen.

+1

Verwenden von 'getppid()' könnte sein hilfreich auch. –

0
#include <stdio.h> 
#include <sys/types.h> 
#include <unistd.h> 
int main() 
{ 
pid_t pid1, pid2, pid3, pid4; 
printf("PID=%d, PPID=%d.\n", getpid(), getppid()); 
pid1=fork(); 

if (pid1!=0) { 
pid2=fork(); 
printf("PID=%d, PPID=%d.\n", getpid(), getppid()); 
pid3=fork(); 
printf("PID=%d, PPID=%d.\n", getpid(), getppid()); 
}else { 
    pid4=fork(); 
    printf("PID=%d, PPID=%d.\n", getpid(), getppid()); } 
return 0; 
} 

Ich habe einige printfs hinzugefügt und ich drucke die Prozess-ID und die Elternprozess-ID, aber jeder hat die gleichen Eltern. Liegt es daran, dass der ursprüngliche Prozess zuerst beendet wird? Ich bekomme this output

+0

In der Tat sind es 6 verschiedene Prozesse, aber ihre Eltern sind nicht wie oben beschrieben –