Está en la página 1de 2

Desde hace un tiempo tengo la idea de escribir sobre el tema de procesos y seales en C.

Las seales se usan para la comunicacin entre procesos y manipularlos. Un ejemplo muy conocido de seal es la seal SIGINT, que se enva cuando el usuario pulsa CTRL+C durante la ejecucin de un programa. Cuando el programa que estamos ejecutando recibe esta seal finalizar su ejecucin. En el siguiente ejemplo vamos a ver cmo podemos hacer para que el programa realice alguna accin especial cuando el usuario pulse CTRL+C. La accin a ejecutar va a ser mostrar el mensaje: Por qu me interrumpes?:

// Para las funciones pause y alarm: #include <unistd.h> // Para las constantes SIGALRM y similares #include <signal.h> #include <stdio.h> // Esta funcin es la que vamos a usar como controlador de la seal SIGINT void despedida() { printf("------------------------\n"); printf("Por qu me interrumpes?\n"); printf("------------------------\n"); raise(SIGTERM); } int main() { // Asociamos la seal SIGINT con la funcion "senal" signal(SIGINT, despedida); // Comenzamos un bucle que har que el programa muestre sin // parar el mensaje "Nada nuevo por aqu" while(1) { printf("Nada nuevo por aqu.\n"); } }

En este programa, cuando el usuario pulse CTRL+C, en lugar de cerrarse directamente, se ejecutar la funcin que hemos asociado con esta seal (la funcion despedida).
La funcin despedida muestra el mensaje Por qu me interrumpes? y genera la seal SIGTERM (raise enva una seal al propio proceso). Si no hiciramos esto el proceso no se detendra nunca (hasta que lo matemos con kill). Si te aburres haz la prue ba con esta funcion:

void despedida() { printf("------------------------\n"); printf("Por qu me interrumpes?\n"); printf("------------------------\n"); }


Otra posibilidad es usar la funcin signal de nuevo para indicar al proceso que use la accin por defecto de SIGINT (SIG_DFL Signal Default):

void despedida() { printf("------------------------\n"); printf("Por qu me interrumpes?\n"); printf("------------------------\n"); signal(SIGINT, SIG_DFL); // Indicamos al programa que use la accin por defecto raise(SIGINT); }
Pero por qu no podemos simplemente llamar a raise(SIGINT);? Se podra pensar que bastara con llamar a raise(SIGINT):

void despedida() { printf("------------------------\n"); printf("Por qu me interrumpes?\n"); printf("------------------------\n"); raise(SIGINT); }


El problema es que la seal SIGINT va a ser procesada por la funcin despedida. De esta forma, cuando pulsemos CTRL+C, se llamar a la funcin despedida. La funcin despedida genera de nuevo la seal SIGINT, que va a ser

procesada de nuevo por ella misma. El resultado es que cuando pulsamos CTRL+c el proceso comenzar a ejecutar una y otra vez la funcin despedida mostrando el mensaje Por qu me interrumpes? sin parar. Por qu? Cada vez que se pulse CTRL+C se ejecuta la funcin despedida en lugar de ejecutarse la accin por defecto (cerrar el programa).

También podría gustarte