Observações
-
ctrl+c
enviaSIGINT
para o processo fg no Terminal 1 - portanto, executar
kill -2 <PID>
no Terminal 2 é o mesmo que baterctrl+c
no Terminal 1 - fazendo um dos dois pontos acima antes executando
kill -10 <PID>
no Terminal 2 manipulaSIGINT
corretamente - executá-lo após executar
kill -10 <PID>
no Terminal 2 (enviar sinalSIGUSR1
) não manipulaSIGINT
corretamente e leva ao comportamento problemático - A substituição de
kill -2 <PID>
no Terminal 2 (SIGINT
) porkill -15 <PID>
(SIGTERM
) oukill -9 <PID>
(SIGKILL
) leva sempre a corrigir a manipulação de sinal. - a execução de
kill -10 <PID>
no Terminal 2 interrompe owait
incorporado, mas não sai do loop, poistest
é imediatamente impressa após o sinalSIGUSR1
ser interceptado e o loop continuar. - O envio de
SIGINT
irrompe do loop de execução e congela o shell ou nunca interrompewait
e permanece em espera / congelado.
Conclusão
SIGINT
não foi encontrado e manipulado corretamente ou é ignorado após a interceptação manual de SIGUSR1
ou talvez de qualquer outra interceptação definida pelo usuário. Isso significa que o processo ainda existe e é por isso que ele consome / aquece a CPU ou congela o shell. A execução de kill -15 <PID>
ou kill -9 <PID>
do Terminal 2 encerra / mata o processo e devolve o controle sobre o Terminal 1 e relaxa sua CPU.
Por que esse problema ocorre, ainda permanece um mistério, mas espero que alguém possa explicar exatamente o que está realmente acontecendo atrás das cortinas.