Señales de comunicación entre procesos

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 30 de noviembre de 2020; las comprobaciones requieren 2 ediciones .

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]

Tipos de señales

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.

  • si pid > 0, la señal se envía al proceso con id pid;
  • si pid = 0, la señal se envía a todos los procesos del grupo al que pertenece el proceso emisor;
  • si pid = −1 y el proceso de envío no es un proceso raíz, la señal se envía a todos los procesos del sistema cuya ID de usuario coincida con la ID de usuario efectiva del proceso de envío.
  • si pid = −1 y el proceso de envío es un proceso raíz, la señal se envía a todos los procesos del sistema, excepto a los procesos del sistema (generalmente a todos excepto a los procesos con pid = 0 y pid = 1);
  • si pid < 0, pero no −1, la señal se envía a todos los procesos del grupo cuyo id sea igual al valor absoluto del argumento pid (si los privilegios lo permiten);
  • si la señal = 0, se realiza una comprobación de errores y no se envía ninguna señal. Esto se puede usar para verificar si el argumento pid es válido (si hay un proceso o grupo de procesos en el sistema con una identificación coincidente).
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]

Instalando tus propios manejadores de señales

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); }

SO en el que se pueden usar las señales

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.

Notas

  1. 1 2 Arquitectura UNIX. Procesos Capítulo 1. Introducción al Sistema Operativo UNIX (enlace muerto) . Consultado el 11 de mayo de 2016. Archivado desde el original el 5 de junio de 2016. 
  2. Lección 8: Medios de comunicación entre procesos . Consultado el 11 de mayo de 2016. Archivado desde el original el 2 de junio de 2016.

Enlaces