Dieses Problem hier ist, dass der untergeordnete Prozess die gleiche Schleife wie der übergeordnete Prozess ausführt, so dass es auch Gabeln.
Wenn Sie chunks
-2 gesetzt und fügen Sie die folgende Schleife nach der ersten Schleife:
for (int i=0;i<chunks;i++){
printf("pid %d, i=%d, proc[i]=%d\n",getpid(),i,proc[i]);
}
Sie werden Ausgang erhalten, die etwa wie folgt aussieht:
I am getting called with i=0
pid 30955, i=0, proc[i]=30956
pid 30955, i=1, proc[i]=30958
pid 30957, i=0, proc[i]=0
pid 30957, i=1, proc[i]=0
pid 30956, i=0, proc[i]=0
pid 30956, i=1, proc[i]=30957
I am getting called with i=1
pid 30958, i=0, proc[i]=30956
pid 30958, i=1, proc[i]=0
Auf der ersten Iteration In der Schleife wird ein neuer Prozess erstellt. Dann durchlaufen beide Prozesse separat die Schleife ein zweites Mal und jeder gibt ein anderes Kind ab. Alle vier Prozesse schließen dann die Schleife ab.
Wenn Sie nicht auch die untergeordneten Prozesse Schleife wollen, müssen das Kind Anruf exit
:
if (proc[proc_iter]==0) {
printf("I am getting called with i=%d\n",proc_iter);
exit(0);
}
Dann wird die Ausgabe wie folgt aussehen:
I am getting called with i=0
I am getting called with i=1
pid 31020, i=0, proc[i]=31021
pid 31020, i=1, proc[i]=31022
Es ist, weil Forking wird auch in untergeordneten Prozessen auftreten. – MikeCAT
Probiere 'chunks = 2' oder' chunks = 3' aus und benutze 'getpid' und' getppid', um die pid und die Elternpid jedes Prozesses zu drucken. – user3386109
der gepostete Code scheint die Tatsache zu ignorieren, dass die 'fork()' -Funktion drei (3) Arten von zurückgegebenen Werten hat 1) <0, bedeutet, dass ein Fehler aufgetreten ist 2) == 0 bedeutet, einen untergeordneten Prozess auszuführen 3)> 0 bedeutet, einen übergeordneten Prozess auszuführen. Jeder untergeordnete Prozess sollte zurückkehren und nicht in der Schleife fortfahren. – user3629249