Os programas podem vincular os manipuladores personalizados ao sinal SIGINT, por exemplo, para executar ações de limpeza. Você pode observar esse comportamento com este script de shell, que vincula um manipulador usando trap:
#!/bin/bash
trap "echo Caught!" SIGINT SIGTERM
while true
do sleep 60
done
Para matar um programa interativo instantaneamente, você pode fazer kill -9 <PID>
em outro shell, ou usar ctrl-Z para suspender o programa e depois matá-lo:
❯ /tmp/test.sh # Our test script with trap
^CCaught! # Ctrl-c doesn't work
^Z # Suspend the process
[1] + 11713 suspended /tmp/test.sh
❯ kill -9 %1
[1] + 11713 killed
Aqui estou usando% 1 para obter o pid desse primeiro processo em segundo plano, que é o script porque não tenho outros processos em segundo plano neste exemplo. Você também pode usar o PID do processo diretamente, para shells que não suportam a sintaxe% 1.
E é isso que o ping faz, basta olhar para o código-fonte : função, configuração é chamada, que conete os manipuladores de sinais , incluindo o SIGINT. O SIGINT está vinculado a sigexit , que define um sinalizador para notificar o mainloop esse ping deve sair. Este sinalizador só é verificado em dois places . Eu acho que uma das chamadas de sistema usadas lá bloqueia ou leva algum tempo para retornar, então a sinalização nunca será verificada ou somente após um atraso.