Las señales de comunicación entre procesos son mensajes que el sistema operativo envía a un proceso, o un proceso envía a otro. Desde el punto de vista del usuario, cuando un proceso recibe una señal, parece que se ha producido una excepción (interrupción). Cuando el proceso recibe una señal, la ejecución del programa del proceso se interrumpe y el control se transfiere a una subrutina (función): el controlador de señales. Después de que se ejecuta el controlador de señales, la ejecución del programa interrumpido se reanuda desde el punto en el que se interrumpió. [1] [2]
Los tipos de señales se especifican mediante números numéricos, pero cuando se programan, generalmente usan nombres simbólicos (constantes) definidos en los archivos de inclusión del sistema. El sistema operativo proporciona una gran cantidad de tipos de señales, pero la mayoría de estos tipos están reservados para fines del sistema; son señales que el sistema operativo envía a un proceso. Sin embargo, también hay señales de que los procesos pueden intercambiarse entre sí.
Dentro de la autoridad del usuario, un proceso puede señalar a cualquier otro proceso cuyo PID conozca utilizando la llamada al sistema kill (a pesar del formidable nombre, esta llamada al sistema no necesariamente mata al proceso al que se dirige).
#include <sys/tipos.h> #incluir <señal.h> matar int ( pid_t pid , señal int );El argumento pid especifica el proceso al que enviar la señal y el argumento de la señal especifica qué señal enviar.
Tipo de señal | Descripción |
---|---|
sigilo | Esta señal hace que termine el proceso que la recibió. Esta es la única señal que no se puede ignorar y para la que no se puede asignar un controlador personalizado. |
SIGTERM | Esta señal es una solicitud para terminar el proceso. La emisión de esta señal, por ejemplo, incluye el comando (¡no una llamada al sistema!) matar. Se supone que el proceso que recibió esta señal debe salir, pero el proceso puede configurar la señal para que se ignore o asignarle su propio controlador. |
SIGCHLD | El sistema envía esta señal al proceso principal cuando finaliza cualquiera de sus procesos secundarios. La respuesta predeterminada a esta señal es ignorar. El proceso padre no necesita preocuparse por manejar esta señal a menos que quiera usarla para sincronizar su ejecución con el proceso hijo. |
SIGALRM | Esta señal se utiliza para contar intervalos de tiempo. Un proceso puede establecer un cierto intervalo de tiempo usando las llamadas al sistema de alarma o setitimer, y una vez transcurrido el intervalo especificado, el sistema le enviará una señal SIGALRM. |
SIGUSR1 y SIGUSR2 | No se reservan asignaciones de sistema para estas señales. Los procesos pueden enviarse estas señales entre sí e interpretarlas como mejor les parezca. [una] |
Para configurar un controlador de señal personalizado, cancelarlo o configurar una señal para que se ignore, use la llamada al sistema de señal.
# incluir <señal.h> void ( * señal ( int sig , void ( * handler ) ( int ))) ( int );El parámetro sig es el número de la señal cuyo procesamiento se va a cambiar. El parámetro del controlador describe una nueva forma de manejar la señal: puede ser un puntero a una función de controlador de señal definida por el usuario, el valor especial SIG_DFL (restaurar el comportamiento predeterminado del proceso en la señal sig) o el valor especial SIG_IGN ( ignorar la señal de firma entrante).
La llamada al sistema devuelve un puntero a la forma anterior de manejar la señal, cuyo valor se puede usar para restaurar la forma anterior si es necesario. El manejador de señales en el proceso tiene la forma de una función con un prototipo:
void nombre_función(int sigtype);
El parámetro de esta función es el tipo de señal (el mismo controlador se puede configurar para manejar señales de diferentes tipos).
Un ejemplo de manejo personalizado de la señal SIGUSR1.
vacío *my_handler(int nsig) { código de función del controlador de señales } int principal() { (vacío) señal (SIGUSR1, my_handler); }Las señales se pueden usar en todos los sistemas Unix, como BSD, FreeBSD, GNU, etc.
En Windows hay un pequeño análogo, la función de señal () del CRT, de cuyas señales, de hecho, solo SIGINT puede usarse para el propósito previsto.