Práctica 5: Procesos en UNIX. Señales.
Añadir al shell de la práctica anterior las siguientes funciones de manejo de las señales. Utilizar el programa enviar.c que se suministra para comprobar el funcionamiento de las señales.
#manejador -v INT HUP SEGV #manejador -t ILL #manejador -t -v USR1 USR2
#manejador2 -p -v -f INT HUP SEGV #manejador2 -f ILL #manejador -p -v USR1 USR2
#manejador3 -v -d10 INT -mHUP
#senales INT SIGINT enmascarada manejador SI (0x12450) flags SA_RESETHAND #senales SIGHUP no enmascarada manejador NO (SIG_DFL) flags SIGINT enmascarada manejador SI (0x12450) flags SA_RESETHAND .......
Información detallada de las llamadas al sistema y las funciones de la librería debe obternerse con man (sigaction, sigprocmask, sigaltstack...). Dado que en linux no existe str2sig, para obtener el número de señal a partir del nombre de la señal puede usarse la función senal del programa enviar.c.
Los manejadores deben instalarse con sigaction y la señales enmascararse y desenmascararse con sigprocmask. SEN1, SEN2 .. representa el nombre de una señal sin el SIG (ejemplo: INT, SEGV, HUP), es decir tal como lo hacen las funciones sig2str y str2sig. El estado de las señales debe obtenerse con sigaction y sigprocmask, ya que almacenarlo en variables del programa podría hacer que tras una llamada a fork() o exec no fuese correcto.
Debe tenerse en cuenta que las señales interrumpen las llamadas al sistema (muy notorio en las funciones que leen de teclado) haciendo que devuelvan -1 con errno=EINTR y sin realizar la tarea para la que fueron invocadas. Es necesario por tanto, que en el caso de que una llamada al sistema sea interrumpida por una señal la reiniciemos, bien directamente después de comprobar que ha sido interrumpida o bien indicándole al sistema que lo haga automáticamente (por medio de sigaction).
FORMA DE ENTREGA
Como en las prácticas anteriores.
FECHA DE ENTREGA VIERNES 9 JUNIO 2006