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 -sparámetro kill, pero ¿cuáles son las circunstancias naturales en las que se envían estas señales? Por ejemplo, ¿cuándo SIGINTse envía?
Además, ¿hay restricciones sobre qué señales se pueden manejar? ¿Se SIGSEGVpueden 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 elsttycomando.SIGTTINySIGTTOUse envían cuando un proceso en segundo plano intenta leer o escribir en su terminal de control.SIGWINCHse envía para indicar que el tamaño de la ventana del terminal ha cambiado.SIGHUPse 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).SIGBUSpara una memoria de acceso no alineada;SIGSEGVpara acceder a una página no asignada;SIGILLpara una instrucción ilegal (código de operación incorrecto);SIGFPEpara una instrucción de punto flotante con malos argumentos (por ejemplosqrt(-1)).SIGALRMnotifica que un temporizador establecido por el proceso ha expirado. Temporizadores pueden ajustarse conalarm,setitimerentre otros.SIGCHLDnotifica a un proceso que uno de sus hijos ha muerto.SIGPIPEse 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 | barybarsale, a) lofoomataSIGPIPE.SIGPOLL(también llamadoSIGIO) notifica al proceso que se ha producido un evento pollable. POSIX especifica eventos sondeables registrados a través deI_SETSIGioctl. Muchos sistemas permiten eventos sondeables en cualquier descriptor de archivo, establecido a través de laO_ASYNCfcntlbandera. Una señal relacionada esSIGURG, que notifica los datos urgentes en un dispositivo (registrado a través deI_SETSIGioctl) o el zócalo .SIGPWRse 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
SIGFPEpoco 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:
SIGSTOPySIGKILLno 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 escucharSIGSEGVy 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 signaldesde 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
SIGINTsucede cuando golpeasCTRL+C.SIGQUITse activa porCTRL+\, y vuelca el núcleo.SIGTSTPsuspende tu programa cuando golpeasCTRL+Z. A diferenciaSIGSTOP, es capturable, lo que brinda a los programas laviposibilidad 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.SIGTTINySIGTTOUpause su programa si intenta leer o escribir en el terminal mientras se ejecuta en segundo plano. ParaSIGTTOUque 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.
SIGILLsignifica 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.SIGFPEsignifica que hubo un error matemático de hardware; Lo más probable es que el programa haya intentado dividir por cero.SIGSEGVsignifica que su programa intentó acceder a una región de memoria no asignada.SIGBUSsignifica que el programa accedió a la memoria incorrectamente de alguna otra manera; No entraré en detalles para este resumen.Interacción del proceso
SIGPIPEsucede si intenta escribir en una tubería después de que el lector de la tubería cerró su extremo. Verman 7 pipe.SIGCHLDsucede cuando un proceso secundario que creó se cierra o se suspende (porSIGSTOPo similar).Útil para auto-señalización
SIGABRTgeneralmente 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".SIGALRMes causado por laalarm()llamada del sistema, lo que hará que el núcleo entregue un mensajeSIGALRMal programa después de un número específico de segundos. Verman 2 alarmyman 2 sleep.SIGUSR1ySIGUSR2se 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
killcomandofgobgen el caso deSIGCONT.SIGKILLySIGSTOPson las señales que no se pueden bloquear. El primero siempre termina el proceso de inmediato; el segundo suspende el proceso.SIGCONTreanuda un proceso suspendido.SIGTERMes una versión atrapable deSIGKILL.fuente
shutdownse usa el comando?SIGTERMse 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.