2012-05-03 18 views
6

Sto cercando di fare un compito a casa dove devo usare fork(), ma non so perché non riesco a fermare i miei forche dopo di loro corsa attraverso il mio ciclo for:fork() a() ciclo

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

int main(int argc, char *argv[]){ 
    int limit = argc/2; 
    if(argc%2 == 0){ 

      perror("the number of arguments given must pe even!"); 
      exit(1); 
    } 

    int i; 
    for(i=0; i<=limit; i++){ 
     if(fork()==-1){ 
      perror("childes couldn't be created\n"); 
      exit(1); 
     } 
     if(fork()==0){ 
      printf("fork: %d \n",i); 
      exit(1); 
     } 
     wait(0); 
    } 


    printf("exiting...\n"); 
    return 0; 
} 

uscita:

[email protected]:~/OS/UprocH$ ./exe a b c d 
fork: 0 
fork: 0 
fork: 1 
fork: 1 
fork: 1 
fork: 2 
fork: 2 
fork: 1 
fork: 2 
exiting... 
exiting... 
fork: 2 
exiting... 
exiting... 
fork: 2 
exiting... 
exiting... 
exiting... 
[email protected]:~/OS/UprocH$ fork: 2 
fork: 2 
fork: 2 
exiting... 
+4

Stai biforcandosi due volte nello stesso ciclo, lo sai? –

+0

Noop come mai, erano ...? : < –

+4

hai creato un bombardamento a forcella. Dovresti fare qualcosa del tipo: pid = fork(); se (pid <0) ...; if (pid == 0) .... – kofemann

risposta

15

Daniel Fischer mi ha costretto a fornire una risposta.

Cambio:

if(fork()==-1){} // first fork 
if(fork()==0){} // second fork 

A:

pid = fork(); 
if(pid == -1) 
{ 
    ... //failed 
} 
else if(pid == 0) 
{ 
    ... //success 
} 

Oppure utilizzare un'istruzione switch:

switch(fork()) 
{ 
    case -1: 
     ... // failed 
     break; 
    case 0: 
     ... // success 
     break; 
} 
+2

Grazie! apprezzato, e hai dato una buona idea con l'interruttore: D –

+4

"forzato" è una parola piuttosto forte;) –

0

Si potrebbe utilizzare execl() o qualche altra variante di exec, questo assicura che il bambino che viene creato non erediti nulla dal genitore. Questo ti permetterebbe di creare dei bambini con un ciclo for senza entrare nell'esplosione esponenziale di un bambino. Modifica opportunamente gli argomenti della funzione execl e puoi creare 3 processi come:

main() 
{ 
    int i,pid[3]; 
    for(i=0;i<3;i++) 
    { 
     pid[i]=fork(); 
     if (pid[i]==0) 
      execl("path",0,0); 
    } 

    sleep(2); 
}