0% encontró este documento útil (0 votos)
16 vistas12 páginas

Práctica 1

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
16 vistas12 páginas

Práctica 1

Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PPTX, PDF, TXT o lee en línea desde Scribd

Práctica 1

Sistemas Operativos
Explicación
del código
• El PID (Process ID) es el
identificador único de un
proceso en un sistema
operativo basado en Unix/Linux
o Windows. Cada proceso en
ejecución tiene un número de
PID único asignado por el
sistema operativo.

1 es el PID del primer proceso (usualmente systemd).


234 es el PID del proceso bash (terminal).
567 es el PID del proceso firefox.
Explicación
del código
• Se crea un ciclo for que se ejecuta tres
veces.
• Cada iteración ejecuta fork(), lo que
genera un nuevo proceso hijo.
• Cada proceso imprime su PID y el de su
padre (getpid() y getppid()).
• Los procesos padres rompen el bucle
(break) después de crear un hijo,
evitando que generen más procesos.
• Cada proceso espera un tiempo aleatorio
antes de continuar (sleep(rand() % 3);).
• El padre espera a su hijo (wait(NULL))
antes de finalizar.
Explicación
del código
• Crea procesos hijos en un bucle

• Se ejecuta un for que itera 3 veces.

• En cada iteración, se llama a fork() para


crear un nuevo proceso.

• Cada proceso muestra su PID y el de su


padre (getpid() y getppid()).

• El proceso padre espera a que terminen


sus hijos.

• wait(NULL); permite que el padre espere a


un hijo antes de terminar.
• ¿Cómo funciona el árbol de procesos?
Explicación • Cada iteración del for genera un nuevo proceso hijo, pero

del código
los procesos padres rompen el bucle después de crear
un hijo, lo que significa que solo habrá 3 procesos en
total.
Explicación del código
Explicación del código
• La duplicación de la salida ocurre debido a la naturaleza del fork() en el código. Cada vez
que llamas a fork(), el proceso actual (el padre) se clona y se crea un nuevo proceso (el
hijo). Esto significa que ambos procesos, el padre y el hijo, ejecutarán el código después
del fork().
• En el código, el ciclo for ejecuta tres iteraciones, y en cada iteración se crea un nuevo
proceso. Cuando se crea un proceso hijo, la instrucción printf("Soy el proceso de PID %d y
mi padre tiene PID %d.\n", getpid(), getppid()); se ejecuta tanto en el padre como en el
hijo, causando que se duplique la salida.
• En cada iteración del ciclo:
• El padre ejecuta el fork() y crea un hijo.
• Ambos procesos (padre e hijo) ejecutan el printf, pero debido al flujo del programa,
los hijos siempre ejecutan el código dentro del ciclo (porque tienen un valor de pid
== 0), mientras que el padre ejecuta solo una vez después de que el hijo se ha
creado.
• El resultado es que en cada iteración de fork(), tanto el proceso padre como el
proceso hijo imprimirán su propio mensaje, lo que provoca la duplicación de la salida.
Explicación • Se puede solucionar cambiando el código
• Lo puedes observar el jerarquia1.c
del código
Práctica
•Observa el siguiente código y
escribe la jerarquía de procesos
resultante.
•Ahora compila y ejecuta el
código para comprobarlo. Presta
atención al orden de terminación
de los procesos, ¿qué observas?
¿por qué?
Explicación •Este programa en C crea una jerarquía de
procesos utilizando fork() y maneja la
del código terminación de los procesos hijos con wait()
Ejecuta el código
jerarquia3.c

• Busca el código jerarquia3.c en


Moodle y ejecútalo.
• ¿Que resultado obtienes de
la ejecución?
• Dibuja la estructura del árbol
de procesos que se obtiene
al ejecutarlo.
Código
• Escribe un programa en C que cree una jerarquía de procesos con la
siguiente estructura:
• El proceso padre creará dos procesos hijos.
• Cada hijo, a su vez, creará un proceso más.
• Todos los procesos deben imprimir su PID (Process ID) y el PID de su padre.
• El padre debe esperar a que terminen todos los hijos antes de finalizar.
• Requisitos del ejercicio
• Utilizar fork() para crear procesos hijos.
• Cada proceso imprimirá su PID y el PID de su padre.
• El proceso padre debe esperar (wait()) a que terminen sus hijos antes de
finalizar.
• Usar usleep() para introducir pequeños retrasos aleatorios en la ejecución.
• Dibuja la jerarquía esperada.

También podría gustarte