SIGINT (ctrl-c) não instantâneo para ping

0

Às vezes executo um comando ping (no GNU / Linux) e ele não para imediatamente quando eu pressiono Ctrl-c .

Para mim, ctrl-c envia uma SIGINT. Quais são as possíveis causas do comando ping para não sair imediatamente?

O que posso fazer para garantir que ele sempre saia instantaneamente?

    
por silviot 02.08.2013 / 12:31

1 resposta

3

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.

    
por 02.08.2013 / 16:22

Tags