A veces me confundo un poco con todas las señales que puede recibir un proceso. Según tengo entendido, un proceso tiene un controlador predeterminado ( disposición de señal ) para cada una de estas señales, pero puede proporcionar su propio controlador llamando sigaction()
.
Así que aquí está mi pregunta: ¿qué hace que se envíen cada una de las señales? Me doy cuenta de que puede enviar señales manualmente a los procesos en ejecución a través del -s
parámetro kill
, pero ¿cuáles son las circunstancias naturales en las que se envían estas señales? Por ejemplo, ¿cuándo SIGINT
se envía?
Además, ¿hay restricciones sobre qué señales se pueden manejar? ¿Se SIGSEGV
pueden procesar incluso las señales y devolver el control a la aplicación?
Respuestas:
Además de las llamadas a procesos
kill(2)
, el núcleo envía algunas señales (o, a veces, el propio proceso) en varias circunstancias:SIGINT
(vuelva al bucle principal) en Ctrl+ C,SIGQUIT
(salga inmediatamente) en Ctrl+ \,SIGTSTP
(suspenda) en Ctrl+ Z. Las claves se pueden cambiar con elstty
comando.SIGTTIN
ySIGTTOU
se envían cuando un proceso en segundo plano intenta leer o escribir en su terminal de control.SIGWINCH
se envía para indicar que el tamaño de la ventana del terminal ha cambiado.SIGHUP
se envía a la señal de que el terminal ha desaparecido (históricamente debido a su módem tuvo h ung arriba , hoy en día por lo general porque se ha cerrado la ventana de emulación de terminal).SIGBUS
para una memoria de acceso no alineada;SIGSEGV
para acceder a una página no asignada;SIGILL
para una instrucción ilegal (código de operación incorrecto);SIGFPE
para una instrucción de punto flotante con malos argumentos (por ejemplosqrt(-1)
).SIGALRM
notifica que un temporizador establecido por el proceso ha expirado. Temporizadores pueden ajustarse conalarm
,setitimer
entre otros.SIGCHLD
notifica a un proceso que uno de sus hijos ha muerto.SIGPIPE
se genera cuando un proceso intenta escribir en una tubería cuando se ha cerrado el final de la lectura (la idea es que si se ejecutafoo | bar
ybar
sale, a) lofoo
mataSIGPIPE
.SIGPOLL
(también llamadoSIGIO
) notifica al proceso que se ha producido un evento pollable. POSIX especifica eventos sondeables registrados a través deI_SETSIG
ioctl
. Muchos sistemas permiten eventos sondeables en cualquier descriptor de archivo, establecido a través de laO_ASYNC
fcntl
bandera. Una señal relacionada esSIGURG
, que notifica los datos urgentes en un dispositivo (registrado a través deI_SETSIG
ioctl
) o el zócalo .SIGPWR
se envía a todos los procesos cuando el UPS señala que una falla de energía es inminente.Estas listas no son exhaustivas. Las señales estándar se definen en
signal.h
.La aplicación puede capturar y manejar la mayoría de las señales (o ignorarlas). Las únicas dos señales portátiles que no pueden captarse son
SIGKILL
(simplemente morir) ySTOP
(detener la ejecución).SIGSEGV
( error de segmentación ) y su primoSIGBUS
( error del bus ) pueden detectarse, pero es una mala idea a menos que realmente sepa lo que está haciendo. Una aplicación común para atraparlos es imprimir un seguimiento de pila u otra información de depuración. Una aplicación más avanzada es implementar algún tipo de gestión de memoria en proceso o atrapar instrucciones incorrectas en motores de máquinas virtuales.Finalmente, permítanme mencionar algo que no es una señal. Cuando presiona Ctrl+ Dal comienzo de una línea en un programa que lee la entrada del terminal, esto le dice al programa que se alcanza el final del archivo de entrada. Esto no es una señal: se transmite a través de la API de entrada / salida. Al igual que Ctrl+ Cy amigos, la clave se puede configurar con
stty
.fuente
SIGFPE
poco intuitiva, también se señala en la división entera por cero y, a veces, en el desbordamiento de entero con signo.Para responder a su segunda pregunta primero:
SIGSTOP
ySIGKILL
no puede ser captado por la aplicación, pero cualquier otra señal puede, inclusoSIGSEGV
. Esta propiedad es útil para la depuración; por ejemplo, con el soporte correcto de la biblioteca, puede escucharSIGSEGV
y generar una traza inversa de la pila para mostrar dónde sucedió esa falla predeterminada.La palabra oficial (para Linux, de todos modos) sobre lo que hace cada señal está disponible escribiendo
man 7 signal
desde una línea de comando de Linux. http://linux.die.net/man/7/signal tiene la misma información, pero las tablas son más difíciles de leer.Sin embargo, sin algo de experiencia con las señales, es difícil saber de las descripciones breves lo que hacen en la práctica, así que aquí está mi interpretación:
Disparado desde el teclado
SIGINT
sucede cuando golpeasCTRL+C
.SIGQUIT
se activa porCTRL+\
, y vuelca el núcleo.SIGTSTP
suspende tu programa cuando golpeasCTRL+Z
. A diferenciaSIGSTOP
, es capturable, lo que brinda a los programas lavi
posibilidad de restablecer el terminal a un estado seguro antes de suspenderse.Interacciones terminales
SIGHUP
("colgar") es lo que sucede cuando cierra su xterm (o desconecta el terminal) mientras su programa se está ejecutando.SIGTTIN
ySIGTTOU
pause su programa si intenta leer o escribir en el terminal mientras se ejecuta en segundo plano. ParaSIGTTOU
que suceda, creo que el programa debe estar escribiendo/dev/tty
, no solo stdout predeterminado.Activado por una excepción de CPU
Esto significa que su programa intentó hacer algo mal.
SIGILL
significa una instrucción de procesador ilegal o desconocida. Esto podría suceder si intentara acceder a los puertos de E / S del procesador directamente, por ejemplo.SIGFPE
significa que hubo un error matemático de hardware; Lo más probable es que el programa haya intentado dividir por cero.SIGSEGV
significa que su programa intentó acceder a una región de memoria no asignada.SIGBUS
significa que el programa accedió a la memoria incorrectamente de alguna otra manera; No entraré en detalles para este resumen.Interacción del proceso
SIGPIPE
sucede si intenta escribir en una tubería después de que el lector de la tubería cerró su extremo. Verman 7 pipe
.SIGCHLD
sucede cuando un proceso secundario que creó se cierra o se suspende (porSIGSTOP
o similar).Útil para auto-señalización
SIGABRT
generalmente es causado por el programa que llama a laabort()
función y causa un volcado de núcleo por defecto. Una especie de "botón de pánico".SIGALRM
es causado por laalarm()
llamada del sistema, lo que hará que el núcleo entregue un mensajeSIGALRM
al programa después de un número específico de segundos. Verman 2 alarm
yman 2 sleep
.SIGUSR1
ySIGUSR2
se usan sin embargo, el programa le gusta. Podrían ser útiles para la señalización entre procesos.Enviado por el administrador
Estas señales generalmente se envían desde el símbolo del sistema, a través del
kill
comandofg
obg
en el caso deSIGCONT
.SIGKILL
ySIGSTOP
son las señales que no se pueden bloquear. El primero siempre termina el proceso de inmediato; el segundo suspende el proceso.SIGCONT
reanuda un proceso suspendido.SIGTERM
es una versión atrapable deSIGKILL
.fuente
shutdown
se usa el comando?SIGTERM
se envía primero, seguido de un retraso, seguido deSIGKILL
. En principio, para un apagado rápido e inmediato, el núcleo no necesita enviar ninguna señal; simplemente podría dejar de ejecutar el proceso.