tem uma lista de sinais padrão e suas ações padrão. Qualquer processo com privilégios suficientes sempre pode enviar qualquer sinal, mas processses (ou você, via processos) não devem fazer isso.
Você deve apenas kill
com e esperar que seus processos sejam kill
ed com TERM e um monte de sinais que podem ser gerados pelo seu ambiente (o shell, o driver de terminal), a menos que você saiba que o alvo lida com o sinal especial que você deseja enviar.
Você pode classificar os sinais básicos por suas ações.
Os sinais de ressalto
ABRT TRAP SYS BUS FPE ILL SEGV XFSZ XCPU QUIT
são gerados por você (TRAP, ABRT, SYS) usando algumas funções especializadas ou entrando em estados de erro difíceis (BUS, FPE, ILL, SEGV).
QUIT
é gerado por um usuário em um terminal que deseja um dump principal ( C+\
).
Você pode querer mantê-los em suas disposições padrão.
Fora dos sinais de terminação :
HUP INT PIPE TERM ALRM POLL PROF USR1 USR2
você deve esperar
HUP INT PIPE TERM
do seu ambiente em várias circunstâncias:
HUP -- when the terminal hungs up or you become a stopped orphaned process
INT -- when the user at the terminal interrupts you with C-c
PIPE -- when a PIPE or socket you write into closes, e.g. by
exiting before you finished writing to it
('yourprogram | (exit)' will give you a 'PIPE'
if yourprogram attempts to write to its STDOUT)
TERM -- when a process ends you a normal termination request
Você deve receber o restante dos sinais de terminação somente se você configurá-lo você mesmo.
KILL e STOP você não pode fazer nada.
Você pode querer interceptar o terminal interrompendo os sinais :
TTIN -- you read from the terminal and you're a backgrounded process
TTOU -- you write the terminal when you're a backgrounded process
and the terminal is set to put you to sleep when you do
TSTP -- you're being put to sleep with 'C-Z'
mas, na pior das hipóteses, isso apenas interromperá seu processo, sem corromper seu estado.
A menos que você saiba que precisa manipular CHLD
, CONT
ou URG
, não precisa.
TL; DR:
Basicamente, acho que HUP, INT, PIPE e TERM devem ser manipulados (ou ignorados) se você normalmente quer fazer alguma limpeza antes da saída. O resto pode ser deixado sozinho, a menos que seu programa use esses sinais, ou a menos que você absolutamente precise de alguma limpeza em todas as circunstâncias.
No último caso, você pode bloquear todos os sinais não manipulados, mas tenha cuidado para que as máscaras de bloqueio de sinal sejam herdadas entre garfos e chamadas execve e ignorem ou bloqueiem sinais como ILL, se surgirem da execução do processo e não forem enviado para você por kill ou sigqueue lhe dará um comportamento indefinido.
Se você quiser mais informações, explore os manpages e os padrões. Os sinais são um assunto muito importante nos Unixes e lidar com eles pode ser muito complicado.