A veces, se nos presenta la necesidad de modificar el comportamiento de nuestro programa por ejemplo cuando el usuario pulse Control+C, o cuando terminemos nuestra aplicación, o cuando… dividamos por 0, o más cosas… podemos ver un listado de las diferentes señales con:
man 7 signal
Podemos utilizar para probar este programa (signals.c):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 | #include <signal.h> #include <stdio.h> #include <unistd.h> #include <stdlib.h> void salir(int recib); void alarma(int que); int tmp=0; int divi=5; int main() { signal(SIGINT, salir); /* Control+C */ signal(SIGKILL, salir); /* kill */ signal(SIGFPE, salir); /* división por 0 */ signal(SIGALRM, alarma); /* alarma */ signal(SIGUSR1, alarma); /* definido por el usuario */ int numero=4; while (1) { usleep(1000); /* Le damos un respiro a la CPU mientras estamos en el bucle */ tmp++; if (tmp%1000==0) { tmp=tmp/divi; printf("tmp = %d\n", tmp); } } } void salir(int recib) { printf("Salgo porque "); switch (recib) { case SIGINT: printf("has pulsado Control+C...\n"); break; case SIGTERM: printf("alguien me ha terminado\n"); break; case SIGFPE: printf("he dividido por 0 y eso no se puede hacer\n"); break; default: printf("yo que sé !!"); } printf("Sólo quería decirte que me quedé contando por %d\n\n", tmp); exit(0); } void alarma(int que) { switch (que) { case SIGALRM: printf("Voy contando por %d\n\nDivi vale %d\n", tmp, divi); break; case SIGUSR1: divi--; break; } } |
Para aprovechar su funcionalidad, tenemos que ejecutarlo desde un terminal, y abrir otro terminal al lado, para ir ejecutando ciertas cosas:
killall signals (o el nombre que le hayáis dado al ejecutable)
killall -14 signals (alarma)
killall -SIGUSR1 signals (varias veces)
Observaremos que con «killall signals» cerraremos directamente, igual que con Control+C, pero antes de salir del programa, nos dará cierta información (función salir); también veremos que con «killall -14 signals» veremos información en pantalla (función alarma), y que con killall -SIGUSR1 signals» veremos que tmp se va dividiendo por un número menor cada vez que la pulsamos, y cuando lo hemos hecho varias veces, dividirá por 0 (y también capturaremos ese error).
Esto puede servir, por ejemplo, por si estamos grabando un informe de lo que estamos haciendo y se cancela la ejecución, pero queremos cerrar el archivo, queremos mostrar un resumen, capturar errores, ignorar las señales… o comunicarnos con otras aplicaciones de forma sencilla
Pingback: Bitacoras.com /
Pingback: Poesía binaria » Conociendo el proceso que me ha enviado una señal (signal) /