Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: michelmarques en 1 Diciembre 2012, 19:00 pm



Título: Duda sobre procesos
Publicado por: michelmarques en 1 Diciembre 2012, 19:00 pm
Hola buenas, quería consultaros cual sería el árbol de procesos resultante de su ejecución, y el orden en que se generarían los procesos. [Tengo la solución del árbol sacada pero no consigo entender el por qué, da ese resultado] Por tanto me ayudaría más una explicación del código "para dummies" que la resolución del mismo.


Citar
#include <todas_las_cabeceras_necesarias.h>
int main(void){
pid_t pid;
int i;
for(i=0; i<4; i++;){
   if(!fork()){
      if ((i%2)==0)
         fork();
      exit(0);
   }
   wait(NULL);
}
return 0;
}


Muchas gracias!


Título: Re: Duda sobre procesos
Publicado por: naderST en 1 Diciembre 2012, 20:04 pm
Sabemos que fork() duplica el código del proceso padre y el proceso hijo resultante continúa su ejecución donde quedó el padre.

Ese código que nos muestras va a ir creando un proceso a la vez y el proceso padre va a esperar que este termine (función wait). En el caso de i = 0 e i = 2 se va a cumplir la condición de ((i%2)==0) y el proceso hijo 0 y 2 crearan un proceso hijo respectivamente, los cuales harán exit inmediatamente. (Ambos procesos quedarán zombies en la tabla de procesos, debido a que su padre no hizo wait).

En general, se van creando procesos secuencialmente y en los casos particulares de i=0 e i=2 los procesos hijos crearan otro proceso hijo (nieto del principal, por así decirlo).


Título: Re: Duda sobre procesos
Publicado por: michelmarques en 1 Diciembre 2012, 20:29 pm
Gracias por tu respuesta, pero despues de tu explicación aún me queda menos claro el resultado, que es el que adjunto. A ver si lo puedo llegar a entender.

Quizá con una traza lo consiga comprender, ... No sé :(

Un saludo

 (http://thumbs.subefotos.com/8f7a8ba1c985225c54a755abfe1ad89ao.jpg) (http://subefotos.com/ver/?8f7a8ba1c985225c54a755abfe1ad89ao.jpg)


Título: Re: Duda sobre procesos
Publicado por: naderST en 1 Diciembre 2012, 21:16 pm
Qué no entiendes? Por qué no haces un ejemplo más sencillo y tratas de entenderlo? También debes tomar en cuenta que fork() una vez duplicado el código por el lado del proceso padre puede devolver -1 si falla o el PID del nuevo proceso hijo, ahora bien por el lado del hijo devuelve 0