Capítulo 6. Programación del tratamiento de señales 6.1. Objetivos Entender la programación con señales de de unix. 6.2. Documentación de las transparencias Las transparencias relevantes para realizar esta práctica son: - Páginas 19-35 de las transparencias de C - Páginas 1-11 de las transparencias de Bibliotecas de C y llamadas al sistema 6.3. Señales en la interfaz de programación de Unix Compile el programa psignal.c: #include <unistd.h> #include <stdlib.h> #include <signal.h> #define VUELTAS 10000000000LL void confirmar(int sig) { char resp[100]; write(1, "Quiere terminar? (s/n):", 24); read(0, resp, 100); if (resp[0]==’s’) exit(0); } int main(void) { long long int i; signal(SIGINT, SIG_IGN); write(1, "No hago caso a CONTROL-C\n", 25); for (i=0; i<VUELTAS; i++); signal(SIGINT, SIG_DFL); write(1, "Ya hago caso a CONTROL-C\n", 25); for (i=0; i<VUELTAS; i++); signal(SIGINT, confirmar); write(1, "Ahora lo que digas\n", 19); for (i=0; i<VUELTAS; i++); exit(0); } y ejecútelo, intentando abortarlo en varios momentos con CONTROL-C. Si los tiempos de los bucles son demasiado cortos o demasiado largos, ajuste el contador de los bucles1. 1 Capítulo 6. Programación del tratamiento de señales Ejecútelo en una ventana y mándele la señal de interrupción desde otro terminal (con kill -SIGINT proceso) para ver que el comportamiento es equivalente 2. Modifíquelo para que si se le manda la señal de terminar (SIGTERM) escriba el mensaje "No quiero terminar" y continúe por donde iba. 6.4. Ficheros ofrecidos En el directorio signal: • psignal.c. • El ejecutable de la modificación pedida: psignal2. 6.5. Resultados pedidos • Explicación del comportamiento del programa psignal.c. • La modificación pedida: psignal2.c. Notas 1. Como estamos al límite de la capacidad de los enteros, para alargar el bucle utilizamos un long long int. Tenga en cuenta que en C, las constantes de ese tipo llevan el sufijo LL, como en 1000000000000000000LL. 2. Puede ver desde otra ventana todos los procesos ligados a cualquier perminal con ps u. 2