Una señal (del inglés signal) es una forma limitada de comunicación entre procesos empleada en Unix y otros sistemas operativos compatibles con POSIX. En esencia es una notificación asíncrona enviada a un proceso para informarle de un evento. Cuando se le manda una señal a un proceso, el sistema operativo modifica su ejecución normal. Si se había establecido anteriormente un procedimiento (handler) para tratar esa señal se ejecuta este, si no se estableció nada previamente se ejecuta la acción por defecto para esa señal.
Envío de señales
- Al escribir Ctrl-C en el shell donde se ejecuta un proceso el sistema le envía una señal SIGINT, que por defecto causa la terminación del proceso. Ctrl-Z hace que el sistema envíe una señal SIGTSTP que suspende la ejecución del proceso.
- La llamada al sistema
kill
enviará la señal especificada al proceso. - Excepciones como la división por cero o la violación de segmento generan señales.
- Los procesos pueden enviar señales tanto a otros procesos como a sí mismos usando kill(2) (por supuesto con los permisos necesarios) por ejemplo kill(pid,SIGUSR1) siendo pid el identificador del proceso al cual deseamos enviar la señal SIGUSR1.
- El núcleo puede generar una señal para informar de un evento a un proceso. Por ejemplo, SIGPIPE se genera cuando un proceso escribe en una tubería que había sido cerrada por el proceso que leía de ella.
Manipulación de señales
Los manipuladores de señales se establecen mediante la llamada al sistema signal(). Si hay un manipulador de señal para una señal dada se invoca y, si no lo hay, se usa el manipulador por defecto. El proceso puede especificar también dos comportamientos por defecto sin necesidad de crear un manipulador: ignorar la señal (SIG_IGN) y usar el manipulador por defecto (SIG_DFL). Hay dos señales que no pueden ser interceptadas ni manipuladas: SIGKILL y SIGSTOP.
La manipulación de señales es vulnerable a que se produzca una condición de carrera, pues las señales son asíncronas y puede ocurrir que llegue otra señal (incluso del mismo tipo) al proceso mientras transcurre la ejecución de la función que manipula la señal. Puede usarse la función sigprocmask para desbloquear la entrega de señales.
Las señales pueden interrumpir una llamada al sistema en proceso, dejando en manos de la aplicación la gestión del PCLSRing.
Lista de señales
La Single Unix Specification especifica las siguientes señales, definidas en <signal.h>:
- SIGABRT - PROCESO abortado.
- SIGALRM - Señal de alarma, salta al expirar el timer. Reprogramable.
- SIGBUS - Error en el bus "access to undefined portion of memory object"(SUS).
- SIGCHLD - Proceso hijo terminado, detenido (*o que continúa). Tratamiento por defecto: ignorar. Reprogramable.
- SIGCONT - Continúa si estaba parado.Tratamiento por defecto: continuar. Reprogramable.
- SIGFPE - Excepción de coma flotante -- "erroneous arithmetic operation"(SUS).
- SIGHUP - Hangup, al salir de la sessión se envía a los processos en Background. Tratamiento por defecto: exit. Reprogramable.
- SIGILL - Instrucción ilegal.
- SIGINT - Interrupción, se genera al pulsar "^c" durante la ejecución. Tratamiento por defecto:exit. Reprogramable.
- SIGKILL - Destrucción inmediata del proceso.Tratamiento:exit. No reprogramable, no ignorable.
- SIGPIPE - Se genera al escribir sobre la pipe sin lector. Tratamiento por defecto:exit. Reprogramable.
- SIGQUIT - Terminar Pau.
- SIGSEGV - segmentation violation.Salta con dirección de memoria ilegal. Tratamiento por defecto:exit + volcado de memoria. Reprogramable.
- SIGSTOP - Detiene el proceso. No reprogramable, no ignorable. Similar a SIGTSTP
- SIGTERM - Terminación. Tratamiento por defecto:exit. Reprogramable.
- SIGTSTP - Parada de terminal. Se genera al pulsar "^z" (Ctrl-z) durante la ejecución.
- SIGTTIN - Proceso en segundo plano intentando leer ("in").
- SIGTTOU - Proceso en segundo plano intentando escribir ("out").
- SIGUSR1 - User defined 1. Signal definido por el usuario.Tratamiento por defecto: exit. Reprogramable.
- SIGUSR2 - User defined 2. Signal definido por el usuario.Tratamiento por defecto: exit. Reprogramable.
- *SIGPOLL - Pollable event.
- *SIGPROF - El temporizador copiador expiró.
- *SIGSYS - Error de argumentos al realizar una llamada al sistema llamada al sistema.
- *SIGTRAP - Trace/breakpoint trap.
- SIGURG - datos importantes disponibles en socket
- *SIGVTALRM - "virtual timer expired"(SUS)
- *SIGXCPU - excedido límite de tiempo de CPU
- *SIGXFSZ - excedido límite de tamaño de fichero
Nota: el asterisco significa que es una extensión de X/Open System Interfaces (XSI). Las frases entre comillas y seguidas de (SUS) son la forma de escribirlas del SUS[1].