bifurcación() en bucle for()
Frecuentes
Visto 9,399 veces
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 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...
2 Respuestas
15
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
0
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 c fork or haz tu propia pregunta.
Estás bifurcando dos veces en el mismo ciclo, ¿lo sabes? - Daan Timmer
Noop, ¿cómo es que, dónde es eso...? :< - Bogdan Maier
has creado una bomba de horquilla. Deberías hacer algo como: pid = fork(); si (pid < 0) ... ; si (pid == 0) .... - kofemann
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: Daan Timmer@DaanTimmer Oye, estás muerto, adelante, responde. - Daniel Fischer