Resultado de la ejecución de código en C

Hola:
Tengo alguna duda sobre el resultado de la ejecución del siguiente código en C:
for(i=0;i<3;i++)
    fork();
Entiendo que el resultado sería la creación de 7 procesos:
i=0 --> Proceso padre crea hijo1
i=1 --> Proceso padre crea hijo2, e hijo1 crea hijo3
i=2 --> Proceso padre crea hijo4, hijo1 crea hijo5, hijo2 crea hijo6, hijo3 crea hijo7
Y si modificara el código de la siguiente forma:
for(i=0;i<3;i++)
    if(i != 1) fork();
¿El resultado sería:? (3 procesos)
i=0 --> Proceso padre crea hijo1
i=1 --> No se crea ningún proceso
i=2 --> Proceso padre crea hijo2, hijo1 crea hijo3
Respuesta
1
Lo mejor para comprobar estos casos es realizar una traza. Pero tracea cada proceso individualmente, no intentes tracear la ejecución simultanea ya que a mi entender es más lioso.
Llamalo así: Pid (identificador del proceso).
Suponemos que Pid=-1 para el proceso padre. Así hacemos coincidir el contador i con los Pid que se crearan desde el padre.
El Pid=-1 ejecutará en el primer caso 3 llamadas a la función fork, por lo tanto lanzará 3 procesos más, aparte de él mismo. Llamemoslos Pid=0, Pid=1, Pid=2.
Ahora Pid=0, entra en su primera llamada con i=1, luego ejecutará 2 veces la llamada al fork, llamemoslos Pid_0=3, Pid_0=4.
Pid=1 entra en su primera llamada con i=2, luego ejecutará 1 vez la llamada al fork. Creando un nuevo proceso Pid_1=5.
Pid=2 entra en su primera llamada con i=3 y no ejecuta ningún fork.
Ahora tomamos los Pid_X. Para ver los procesos que se lanzan en segundo nivel.
Pid_0=3 ejecutará su primera llamada con i=2, ya que el se lanzó con i=1, por lo tanto ejecutará una vez la llamada al fork, Pid_0_3 = 6.
Pid_0=4 ejecutará su primera llamada con i=2, ya que el se lanzó con i=1, por lo tanto ejecutará una vez la llamada al fork, Pid_0_4 = 7.
Pid_1=5 ejecutará su primera llamada con i=3, ya que el se lanzó con i= 2, por lo tanto no ejecutará ninguna llamada a fork.
Ahora tomamos los Pid_X_X. Para ver los que se lanzan en tercer nivel.
Pid_0_3=6. ejecutará su primera llamada con i=3, ya que el se lanzó con i= 2, por lo tanto no ejecutará ninguna llamada a fork.
Pid_0_4=7. ejecutará su primera llamada con i=3, ya que el se lanzó con i= 2, por lo tanto no ejecutará ninguna llamada a fork.
Ahora como ves tenemos 7 procesos hijos creados, que sumados al primer proceso padre nos hacen un total de 8 procesos.
Puedes aplicar el mismo razonamiento para el siguiente caso:
Pid=-1 que es el proceso padre. Ejecuta 2 llamadas al fork creando dos procesos hijos. Pid=0, Pid=1.
Pid=0 es lanzado con i=0, luego su primera ejecución será con i=1, por lo tanto ejecutará solo 1 llamada más al fork, ya que con i=1 no hay llamada pero si con i=2. Pid_0=2.
Pid=1 es lanzado con i=0, idem que el anterior, por lo tanto solo lanza un proceso. Pid_1=3.
Pasamos al segundo nivel:
Pid_0=2 es invocado con i=2, luego su primera ejecución será con i=3 por lo tanto no ejecutará nada.
Pid_1=3 es invocado con i=2 por lo tanto no ejecutará nada.
Luego tienes un total de cuatro procesos hijos creados, que sumados al proceso padre hacen un total de 5 procesos.
No se si he conseguido explicarme, o he liado más el asunto.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas