2012-05-03 29 views
6

Estoy tratando de hacer una tarea donde tengo que usar fork() pero no sé por qué no puedo detener mis bifurcaciones después de ejecutarlos a través de mi bucle for:fork() en for() loop

#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; 
} 

salida:

[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

Está bifurcando dos veces en el mismo ciclo, ¿lo sabe? –

+0

Noop ¿cómo es que, fue eso ...? : < –

+4

has creado una bomba de horquilla. Debería hacer algo como: pid = fork(); if (pid <0) ...; if (pid == 0) .... – kofemann

Respuesta

15

Daniel Fischer me obligó a dar una respuesta.

Cambio:

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

Para:

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

O utilizar una sentencia switch:

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

¡Gracias! apreciado, y les has dado una buena idea con el interruptor: D –

+4

"forzado" es una palabra bastante fuerte;) –

0

Usted podría utilizar execl() o alguna otra variante del ejecutivo, esto asegura que el niño que se está creando no hereda nada del padre. Esto le permitiría crear niños con un bucle for sin entrar en una explosión infantil exponencial. Modifique los argumentos de la función execl de forma adecuada y puede crear 3 procesos como:

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

    sleep(2); 
}