Como CTRL + C funciona
A primeira coisa é entender como funciona o CTRL + C .
Quando você pressiona CTRL + C , o emulador de terminal envia um caractere ETX (fim do texto / 0x03).
O TTY é configurado de tal forma que, quando recebe este caractere, ele envia um SIGINT para o grupo de processos de primeiro plano do terminal. Essa configuração pode ser visualizada fazendo stty
e observando intr = ^C;
.
A especificação POSIX diz que quando o INTR é recebido, ele deve enviar um SIGINT para o primeiro plano grupo de processos desse terminal.
O que é o grupo de processos em primeiro plano?
Então, agora a questão é: como você determina o que é o grupo de processos em primeiro plano? O grupo de processos em primeiro plano é simplesmente o grupo de processos que receberão quaisquer sinais gerados pelo teclado (SIGTSTOP, SIGINT, etc).
A maneira mais simples de determinar o ID do grupo de processos é usar ps
:
ps ax -O tpgid
A segunda coluna será o ID do grupo de processos.
Como envio um sinal para o grupo de processos?
Agora que sabemos qual é o ID do grupo de processos, precisamos simular o comportamento POSIX de enviar um sinal para o grupo inteiro.
Isso pode ser feito com kill
colocando -
na frente do ID do grupo.
Por exemplo, se o seu ID de grupo de processos for 1234, você usaria:
kill -INT -1234
Simule CTRL + C usando o número do terminal.
Portanto, o texto acima mostra como simular CTRL + C como um processo manual. Mas e se você souber o número TTY e quiser simular CTRL + C para aquele terminal?
Isso se torna muito fácil.
Vamos supor que $tty
é o terminal que você deseja segmentar (você pode obter isso executando tty | sed 's#^/dev/##'
no terminal).
kill -INT -$(ps h -t $tty -o tpgid | uniq)
Isso enviará uma SIGINT para qualquer grupo de processos em primeiro plano de $tty
.