También disponible en: English · Português · Français · العربية
Números de señal en Linux
El número de cada señal en cinco plataformas, la búsqueda inversa para un número suelto, y el motivo de que los números no coincidan.
¿Qué son los números de señal?
Una señal es la forma que tiene un sistema Unix de interrumpir un proceso en marcha: para pedirle que pare, para avisarle de que un hijo ha terminado, para informarle de que ha tocado memoria que no debía. Cada una tiene un nombre como SIGTERM y un entero pequeño, y kill envía una por cualquiera de los dos. Los nombres los fija POSIX. Los números no.
Ahí está toda la dificultad. POSIX estandariza qué señales existen y qué significan, y deja la numeración a cada implementación, así que la tabla de abajo tiene cinco columnas, una por plataforma, y bastantes filas donde no coinciden.
Esta página lleva las 39 señales del manual de Linux y de la cabecera de Apple, con el número que le asigna cada plataforma, si POSIX la estandariza y qué hace la acción por defecto si no la manejas. Encima de la tabla está el control que más importa: escribe un número suelto y te dice qué significa en todas partes.
Cómo usarla
- Empieza por el número, si es lo que tienes. Escríbelo en la búsqueda inversa y obtienes la señal que nombra en cada plataforma, y un aviso si no coinciden. Esa es la dirección en la que te deja una línea de registro o un estado de salida.
- Busca por nombre, número o descripción. SIGKILL, kill, 9 y pipe funcionan todos, y el nombre exacto sale primero en vez de quedar enterrado bajo todo lo que simplemente contiene esas letras.
- Lee la fila entera. La acción por defecto te dice qué pasa si tu programa ignora la señal, y «no existe» significa que la señal no está ahí en absoluto, que es un hecho distinto de tener otro número.
Por qué no coinciden los números, y por qué no es al azar
El ejemplo famoso es SIGUSR1. Es 10 en x86 y ARM, 30 en Alpha y SPARC, y 16 en MIPS y PA-RISC: tres números distintos para un nombre, y todos ellos Linux. La divergencia no es entre sistemas operativos, es entre arquitecturas del mismo.
Dicho así suena a incordio. Dicho al revés es un peligro: el mismo número significa señales distintas. El diez es SIGUSR1 en x86 y SIGBUS en casi todo lo demás, así que un script o un trozo de código que fije el 10 a mano no falla de forma ruidosa cuando corre donde no esperaba. Manda un error de bus a un proceso que esperaba una señal de usuario, y el proceso muere de una manera para la que nadie escribió un manejador.
Lo tranquilizador es que el desacuerdo tiene forma. De las 31 señales que definen tanto el manual de Linux como la cabecera de Apple, macOS coincide con la columna de Alpha y SPARC en todas y cada una, y con x86 solo en 19. macOS y esas arquitecturas descienden de BSD; Linux sobre x86 siguió en cambio la numeración de System V. Así que aquí hay en realidad dos familias, y una columna de la tabla de Linux es la columna BSD con otra etiqueta.
Un puñado de números son iguales en todas partes, y por eso son los que la gente recuerda: 1 siempre es SIGHUP, 2 siempre SIGINT, 9 siempre SIGKILL, 15 siempre SIGTERM. Esos cuatro se pueden fijar a mano sin miedo. Casi ningún otro.
Límites honestos
Cinco plataformas no son todas las plataformas. El manual de Linux documenta cuatro agrupaciones de arquitecturas y Apple documenta macOS; los demás BSD, Solaris, AIX y el resto tienen sus propias cabeceras y no aparecen aquí. Como todo el sentido de la página es que los números varían, trata una ausencia como «desconocido» y no como «coincide»: la conclusión segura de esta tabla es siempre usar el nombre.
La tabla además se detiene antes de las señales de tiempo real. Van de SIGRTMIN a SIGRTMAX, no tienen nombres individuales, y SIGRTMIN ni siquiera es una constante: la biblioteca de C se reserva algunas de las bajas para su propio uso, así que el valor cambia entre sistemas e incluso entre versiones de la biblioteca. Un número de ese rango no se puede buscar en ninguna tabla, que es una versión más fuerte del mismo aviso.
Y los números de señal no son códigos de salida, aunque se encuentran. Un shell informa de un proceso matado por la señal N como estado de salida 128 más N, así que un estado 137 significa la señal 9 en una plataforma donde el 9 es SIGKILL. Esa aritmética es un convenio del shell y no parte de la señal, y hereda el mismo problema de portabilidad.
Los datos se leen del manual signal(7) de Linux y de la cabecera xnu de Apple, no de otra tabla, y debajo de la lista está la fecha en que se leyeron.
¿Por qué es gratis?
Porque no cuesta nada mantenerla. La tabla forma parte de la página y la búsqueda ocurre en tu navegador; no se sube nada y ningún servidor ve lo que consultaste.
El guion que lee ambas fuentes está guardado junto a los datos que produce, y las pruebas comprueban por su nombre los números y la medición del árbol genealógico, así que una fila mala rompe la compilación en vez de llegar a la página.