Señal (Unix)

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 2 de septiembre de 2018; las comprobaciones requieren 6 ediciones .

Una señal en los sistemas operativos de la familia Unix  es una notificación asíncrona de un proceso sobre un evento, una de las principales formas de interacción entre procesos . Cuando se envía una señal a un proceso, el sistema operativo interrumpe la ejecución del proceso, y si el proceso ha instalado su propio controlador de señales , el sistema operativo inicia este controlador y le pasa información sobre la señal, si el proceso no lo ha hecho. instaló un controlador, luego se ejecuta el controlador predeterminado.

Los nombres de señal "SIG..." son constantes numéricas ( definiciones de macro C ) con valores definidos en el archivo de encabezado signal.h. Los valores numéricos de las señales pueden variar de un sistema a otro, aunque la mayoría de ellas tienen los mismos valores en diferentes sistemas. La utilidad kill le permite especificar una señal como un número o símbolo.

La especificación de la señal está incluida en los estándares POSIX .

Enviando señales

Se envían señales:

No se pueden enviar señales a un proceso terminado que se encuentra en estado zombi .

Procesamiento de señales

El controlador predeterminado para la mayoría de las señales finaliza el proceso. Para el manejo alternativo de todas las señales excepto SIGKILL y SIGSTOP , un proceso puede asignar su propio manejador o ignorar su ocurrencia modificando su máscara de señal . La única excepción es un proceso con pid 1 ( init ), que tiene derecho a ignorar o procesar cualquier señal, incluidas KILL y STOP.

Seguridad

Un proceso (o usuario de shell) con un UID real distinto de 0 ( UID de superusuario ) solo puede enviar señales a procesos con el mismo UID real.

Clasificación de señales

POSIX define 28 señales que se pueden clasificar de la siguiente manera:

Nombre El código Acción por defecto Descripción Tipo de
SIGABRT 6 Terminar con un volcado de memoria La señal enviada por la función.abort() Control
SIGALRM catorce Terminación Señal de expiración del tiempo fijadoalarm() Notificación
SIGBUS diez Terminar con un volcado de memoria Mal manejo de la memoria física Excepción
SIGCHLD Dieciocho ignorado Proceso secundario terminado o detenido Notificación
SIGCONT 25 Continuar ejecución Reanudar un proceso previamente detenido Control
SIGFPE ocho Terminar con un volcado de memoria Operación aritmética errónea Excepción
SUSCRÍBETE una Terminación Cierre de terminal Notificación
SEÑAL cuatro Terminar con un volcado de memoria Instrucción de procesador no válida Excepción
SEGUIR 2 Terminación Señal de interrupción (Ctrl-C) de la terminal Control
sigilo 9 Terminación rescisión incondicional Control
TUBO DE SEÑAL 13 Terminación Escribir en conexión rota (tubería, enchufe) Notificación
SIGQUITAR 3 Terminar con un volcado de memoria Señal "Salir" de la terminal (Ctrl-\) Control
SIGSEGV once Terminar con un volcado de memoria Trastorno de acceso a la memoria Excepción
SEGUIMIENTO 23 Detener un proceso Detener un proceso Control
SIGTERM quince Terminación Señal de terminación (señal predeterminada para la utilidad de eliminación) Control
SIGTSTP veinte Detener un proceso Detener la señal de la terminal (Ctrl-Z). Control
SIGTTIN 26 Detener un proceso Intento de lectura desde la terminal por proceso en segundo plano Control
SIGTTU 27 Detener un proceso Intento de escribir en la terminal mediante un proceso en segundo plano Control
SIGUSR1 dieciséis Terminación Señal de usuario #1 Disfraz
SIGUSR2 17 Terminación Señal de usuario #2 Disfraz
SIGPOLL 22 Terminación Evento rastreadopoll() Notificación
SIGPROF 29 Terminación Expiración del temporizador de generación de perfiles depuración
SIGSYS 12 Terminar con un volcado de memoria Llamada al sistema incorrecta Excepción
SIGTRAP 5 Terminar con un volcado de memoria Trace trap o breakpoint depuración
SIGURG 21 ignorado Datos urgentes recibidos en el socket Notificación
SIGVTALRM 28 Terminación Caducidad del "temporizador virtual" Notificación
SIGXCPU treinta Terminar con un volcado de memoria El proceso ha superado el límite de tiempo de la CPU Excepción
SIGXFSZ 31 Terminar con un volcado de memoria El proceso ha excedido el tamaño de archivo permitido Excepción

También hay señales no definidas en POSIX pero presentes en algunos sistemas operativos.

Al manejar excepciones y señales de depuración, un proceso puede escribir un archivo con un volcado de memoria del proceso ( imagen central ) en el directorio actual antes de terminar ,  con lo cual el depurador puede restaurar las condiciones bajo las cuales ocurrió esta excepción. A veces (por ejemplo, para programas que se ejecutan como raíz), no se crea un volcado de memoria por razones de seguridad.

SA_SIGINFO

Por lo general, un manejador de señales toma solo un argumento, el número de señal (esto le permite usar la misma función de manejador para múltiples señales). sigaction()Si especifica la opción SA_SIGINFO al configurar el controlador de señal (usando la función ), se pasarán dos argumentos más al controlador:

  1. puntero a una estructura siginfo_tque contiene:
    • una máscara de bits de "códigos de señal" adicionales que determinan la causa de su aparición;
    • ID de proceso (PID) que envió la señal;
    • el identificador de usuario efectivo (UID) bajo el cual killse ejecuta el proceso (por ejemplo, utilidad) que envió la señal;
    • la dirección de la instrucción en la que ocurrió la excepción;
    • etc.
  2. un puntero al "contexto de la máquina" en el momento en que se produjo la señal (con la "pila de señales": datos adicionales que se insertan en la pila cuando se llaman algunas señales de excepción).

La mayoría de los códigos adicionales son específicos para cada señal. Códigos comunes a todas las señales:

El código Descripción
SI_USUARIO Señal enviada por función kill()(o utilidad kill)
SI_QUEUE Señal enviada por funciónsigqueue()
SI_TIMER La señal se envía después del tiempo establecido por la funcióntimer_settime()
SI_ASYNCIO Señal enviada al completar una solicitud de "E/S asíncrona"
SI_MESGQ Señal enviada cuando aparece un mensaje en una "cola de mensajes de Unix" vacía

Enlaces