No Linux, o que acontece quando um programa (que possivelmente possui vários threads) recebe um sinal, como SIGTERM ou SIGHUP?
Qual thread intercepta o sinal? Vários threads podem obter o mesmo sinal? Existe um segmento especial dedicado inteiramente ao tratamento de sinais? Se não, o que acontece dentro do thread que vai tratar o sinal? Como a execução continua após a conclusão da rotina do manipulador de sinais?
pthreads(7)
descreve que POSIX.1 requer que todos os threads em um processo compartilhem atributos, incluindo:POSIX.1 também requer que alguns atributos sejam distintos para cada thread, incluindo:
máscara de sinal (
pthread_sigmask(3)
)pilha de sinal alternativo (
sigaltstack(2)
)A
complete_signal
rotina do kernel Linux possui o seguinte bloco de código - os comentários são bastante úteis:Então, você vê que você está no comando de onde os sinais são entregues:
Se o seu processo definiu a disposição de um sinal para
SIG_IGN
ouSIG_DFL
, então o sinal é ignorado (ou padrão - kill, core ou ignore) para todos os threads.Se o seu processo definiu a disposição de um sinal para uma rotina de tratamento específica, então você pode controlar qual thread receberá os sinais, manipulando máscaras de sinal de thread específicas usando
pthread_sigmask(3)
. Você pode nomear um thread para gerenciar todos eles, ou criar um thread por sinal, ou qualquer mistura dessas opções para sinais específicos, ou você pode contar com o comportamento padrão atual do kernel Linux de entregar o sinal ao thread principal.Alguns sinais, no entanto, são especiais de acordo com a
signal(7)
página do manual:fonte