Para responder a su segunda pregunta primero: SIGSTOP
y SIGKILL
no puede ser captado por la aplicación, pero cualquier otra señal puede, incluso SIGSEGV
. Esta propiedad es útil para la depuración; por ejemplo, con el soporte correcto de la biblioteca, puede escuchar SIGSEGV
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 golpeas CTRL+C
.
SIGQUIT
se activa por CTRL+\
, y vuelca el núcleo.
SIGTSTP
suspende tu programa cuando golpeas CTRL+Z
. A diferencia SIGSTOP
, es capturable, lo que brinda a los programas la vi
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
y SIGTTOU
pause su programa si intenta leer o escribir en el terminal mientras se ejecuta en segundo plano. Para SIGTTOU
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. Ver man 7 pipe
.
SIGCHLD
sucede cuando un proceso secundario que creó se cierra o se suspende (por SIGSTOP
o similar).
Útil para auto-señalización
SIGABRT
generalmente es causado por el programa que llama a la abort()
función y causa un volcado de núcleo por defecto. Una especie de "botón de pánico".
SIGALRM
es causado por la alarm()
llamada del sistema, lo que hará que el núcleo entregue un mensaje SIGALRM
al programa después de un número específico de segundos. Ver man 2 alarm
y man 2 sleep
.
SIGUSR1
y SIGUSR2
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
comando fg
o bg
en el caso de SIGCONT
.
SIGKILL
y SIGSTOP
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 de SIGKILL
.