2016-07-24 28 views
1

Auch wenn ich den Teil des Codes ausführen, die nur im Kind Prozess ausgibt, aber die Ausgabe kommt viele Male. wie hier gab ich chunks = 8 aber die Ausgabe ist wie 100+ mal.Die Nr. der Prozesse ist exponentiell, auch wenn ich nicht übergeordnete Prozess

Here is the code: 

#include<stdio.h> 
#include<string.h> 


int main(){ 

int chunks=8; 

int proc[25]; 
for(int proc_iter=0;proc_iter<chunks;proc_iter++){ 
    proc[proc_iter]=fork(); 

    if(proc[proc_iter]==0){ 
    printf("I am getting called with i=%d",proc_iter); 
    } 
} 
return 0; 
} 
+1

Es ist, weil Forking wird auch in untergeordneten Prozessen auftreten. – MikeCAT

+0

Probiere 'chunks = 2' oder' chunks = 3' aus und benutze 'getpid' und' getppid', um die pid und die Elternpid jedes Prozesses zu drucken. – user3386109

+0

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

Antwort

2

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