bifurcación() en bucle for()

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

#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:

warzaru@ubuntu:~/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...
warzaru@ubuntu:~/OS/UprocH$ fork: 2 
fork: 2 
fork: 2 
exiting...

preguntado el 03 de mayo de 12 a las 22:05

Estás bifurcando dos veces en el mismo ciclo, ¿lo sabes? -

Noop, ¿cómo es que, dónde es eso...? :< -

has creado una bomba de horquilla. Deberías hacer algo como: pid = fork(); si (pid < 0) ... ; si (pid == 0) .... -

if(fork()==-1) <- primer tenedor, if(fork()==0) <- segundo tenedor. Si la primera bifurcación funciona, también seguirá generando nuevas bifurcaciones. creando así dos bifurcaciones dentro de un ciclo, que se repetirá nuevamente, por lo que ahora tiene un proceso/hilo principal que se repite nuevamente y un proceso secundario adicional que se bifurca nuevamente:

@DaanTimmer Oye, estás muerto, adelante, responde. -

2 Respuestas

Daniel Fischer me obligó a dar una respuesta.

Cambiar:

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

A:

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

O use una declaración de cambio:

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

contestado el 03 de mayo de 12 a las 22:05

¡Gracias! apreciado, y les diste una buena idea con el interruptor: D - bogdan maier

"forzado" es una palabra bastante fuerte ;) - Daniel Fischer

Puede usar execl() o alguna otra variante de exec, esto asegura que el niño que se crea no herede nada del padre. Esto le permitiría crear elementos secundarios con un bucle for sin entrar en una explosión exponencial de elementos secundarios. Modifique los argumentos de la función execl adecuadamente 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);
}

Respondido 10 Abr '15, 08:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.