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 .
Se envían señales:
No se pueden enviar señales a un proceso terminado que se encuentra en estado zombi .
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.
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.
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.
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:
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 |
Comunicación entre procesos | |
---|---|
Métodos | |
Protocolos y estándares seleccionados |