Para responder à sua segunda pergunta primeiro: SIGSTOP
e SIGKILL
não pode ser capturado pelo aplicativo, mas todos os outros sinais podem, inclusive SIGSEGV
. Essa propriedade é útil para depuração - por exemplo, com o suporte correto da biblioteca, você pode escutar SIGSEGV
e gerar um backtrace de pilha para mostrar exatamente onde esse segfault aconteceu.
A palavra oficial (para o Linux, de qualquer maneira) sobre o que cada sinal faz está disponível digitando man 7 signal
em uma linha de comando do Linux. http://linux.die.net/man/7/signal tem as mesmas informações, mas as tabelas são mais difíceis de ler.
No entanto, sem alguma experiência com sinais, é difícil saber pelas breves descrições o que eles fazem na prática, então aqui está minha interpretação:
Acionado pelo teclado
SIGINT
acontece quando você bate CTRL+C
.
SIGQUIT
é acionado por CTRL+\
e despeja o núcleo.
SIGTSTP
suspende seu programa quando você bate CTRL+Z
. Ao contrário SIGSTOP
, é alcançável, o que dá aos programas vi
a chance de redefinir o terminal para um estado seguro antes de se suspender.
Interações terminais
SIGHUP
("hangup") é o que acontece quando você fecha o xterm (ou desconecta o terminal) enquanto o programa está em execução.
SIGTTIN
e SIGTTOU
pause seu programa se ele tentar ler ou gravar no terminal enquanto estiver em execução em segundo plano. Para SIGTTOU
que isso aconteça, acho que o programa precisa estar gravando /dev/tty
, não apenas o stdout padrão.
Acionado por uma exceção de CPU
Isso significa que seu programa tentou fazer algo errado.
SIGILL
significa uma instrução ilegal ou desconhecida do processador. Isso pode acontecer se você tentar acessar as portas de E / S do processador diretamente, por exemplo.
SIGFPE
significa que houve um erro de matemática no hardware; provavelmente o programa tentou dividir por zero.
SIGSEGV
significa que seu programa tentou acessar uma região não mapeada da memória.
SIGBUS
significa que o programa acessou a memória incorretamente de alguma outra maneira; Não entrarei em detalhes neste resumo.
Interação de processo
SIGPIPE
acontece se você tentar gravar em um tubo depois que o leitor do tubo fechar sua extremidade. Veja man 7 pipe
.
SIGCHLD
acontece quando um processo filho que você criou fecha ou é suspenso (por SIGSTOP
ou semelhante).
Útil para auto-sinalização
SIGABRT
geralmente é causado pelo programa que chama a abort()
função e causa um dump principal por padrão. Uma espécie de "botão de pânico".
SIGALRM
é causado pela alarm()
chamada do sistema, que fará com que o kernel entregue um SIGALRM
programa ao programa após um número especificado de segundos. Veja man 2 alarm
e man 2 sleep
.
SIGUSR1
e SIGUSR2
são usados como o programa gosta. Eles podem ser úteis para sinalizar entre processos.
Enviado pelo administrador
Esses sinais geralmente são enviados a partir do prompt de comandos, via kill
comando, fg
ou bg
no caso de SIGCONT
.
SIGKILL
e SIGSTOP
são os sinais desbloqueáveis. O primeiro sempre termina o processo imediatamente; o segundo suspende o processo.
SIGCONT
retoma um processo suspenso.
SIGTERM
é uma versão capturável de SIGKILL
.