Existem várias maneiras de cortar o efeito de Ctrl + C :
- Altere a configuração do terminal para que não gere um sinal.
- Bloqueie o sinal para que seja salvo para entrega posterior, quando o sinal for desbloqueado.
- Ignore o sinal ou defina um manipulador para ele.
- Executar subprocessos em um grupo de processos em segundo plano.
Como você deseja detectar que Ctrl + C foi pressionado, ignorar o sinal está fora. Você pode alterar as configurações do terminal, mas precisará escrever código de processamento de chave personalizado. As conchas não fornecem acesso ao bloqueio de sinal.
No entanto, você pode isolar subprocessos de receber o sinal automaticamente, executando-os em um grupo de processos separado. Shells interativos executam comandos de segundo plano em um grupo de processos separado por padrão, mas shells não interativos os executam no mesmo grupo de processos, e todos os processos no grupo de processos de primeiro plano recebem um sinal de eventos de terminal. Para dizer ao shell para executar tarefas em segundo plano em um grupo de processos separado, execute set -m
. A execução de setsid ping …
é outra maneira de forçar o ping
a ser executado em um grupo de processos separado.
set -m
interrupted=
trap 'echo Interrupted, but ping may still be running' INT
set -m
ping … &
while wait; [ $? -ge 128 ]; do echo "Waiting for background jobs"; done
echo ping has finished
Se você quiser Ctrl + Z para suspender um grupo de processos em segundo plano, você precisará propagar o sinal do shell.
Controlar sinais com precisão é um pouco difícil para um shell script, e shells diferentes de ATT ksh tendem a ser um pouco problemáticos quando você alcança os casos de canto, então considere uma linguagem que lhe dê mais controle como Perl, Python. ou Ruby.