Clase 3
- Comunicación entre procesos: Signals
- Comunicación entre procesos: Pipes
Material
Prácticas
Signals - Práctica 1
-
Crear el archivo
loop.py
. Escribir en su interior:import time while True: time.sleep(1) print("tick")
-
Ejecutar el script.
python loop.py
Se deberá observar en la consola los mensajes
“tick”
cada un segundo. -
Ejecutar la lista de procesos activos para ver el estado del mismo y obtener el PID.
ps -elf
Aparecerá el proceso con una
S
(Interruptable) debido a la funciónsleep()
. Obtener el PID. -
Presionar
Ctrl+Z
para enviar la signalSIGSTP
al proceso. -
Ejecutar la lista de procesos activos para ver el estado.
ps -elf
Aparecerá el proceso con una
T
(stopped). -
Reanudar el proceso enviando la señal de continuar:
kill -SIGCONT pid
-
Se deberá ver el
"tick"
nuevamente.
Signals - Práctica 2
Escribir un programa que cree una instancia hija con fork()
. El proceso padre deberá registrar el handler para SIGCHLD
, y dentro del mismo ejecutar la función wait()
. El proceso hijo deberá ejecutar un sleep
de 5 segundos y luego terminar. Asegurarse mediante el comando ps
que el proceso hijo no quede en estado zombie.
Investigar cómo reacciona el proceso padre (con y sin SA_RESTART
) si recibe la señal SIGCHLD
mientras está ejecutando las funciones:
read(STDIN_FILENO, ...)
sleep(...)
pause()
Pipes - Práctica 1
Tomar el ejercicio de la práctica 2 de signals y comunicar el proceso hijo con el padre mediante pipes. El proceso hijo deberá enviar un mensaje luego de esperar 5 segundos, luego esperará 10 segundos y terminará. El proceso padre deberá imprimir el mensaje por pantalla.
Implementar correctamente las llamadas a read
y write
de forma tal que los procesos reaccionen mostrando un mensaje de error apropiado en los siguientes casos:
read
en el pipe cuando el hijo termina prematuramente.write
en el pipe cuando el padre termina prematuramente.