Meu entendimento atual dos sinais do teclado no terminal é (baseado principalmente na tentativa de mapear minhas observações para o que pode ser encontrado no google) a seguir:
- Usuário pressiona Cc
- Isso é enviado ao buffer de entrada do terminal como um byte que é calculado limpando 2 bits mais à esquerda do valor ascii de 7 bits de c
Depois disso, começa a ficar realmente nebuloso, porque a configuração que entrada significa que sinal é feito no terminal (stty). Suponho que isso signifique que o próprio terminal está enviando o sinal para o processo. Mas eu também acho que esse terminal não sabe sobre o aplicativo que está lendo.
Como o envio de um sinal pelo teclado no terminal funciona de ponta a ponta?
Respostas:
Pressionar Cenquanto Ctrlpressionado envia um pressionamento de tecla seguido pelo evento X11 de liberação de tecla para o emulador de terminal.
Nesse evento (geralmente o pressionamento de tecla), o emulador de terminal grava o byte 0x3 (
^C
) em seu descritor de arquivo no lado principal do dispositivo pseudo-tty.Se a
isig
configuração termios do dispositivo estiverintr
ativada e se a configuração estiver definida para esse byte de 0x3, o kernel envia o sinal SIGINT a todos os membros do grupo de processos em primeiro plano do dispositivo terminal (outro atributo armazenado no dispositivo pty). Nesse caso, o byte 0x3 não estará disponível para leitura no lado escravo do pty.Geralmente, são shells interativos que criam grupos de processos (com
setpgid()
) para trabalhos de shell e decidem qual deles colocar em primeiro plano (comtcsetpgrp()
para definir esse atributo do dispositivo pty) ou não.Por exemplo, quando você executa no prompt de um shell interativo:
O shell inicia um novo grupo de processos com dois processos (nos quais é executado
foo
ebar
depois de conectar seu stdin / out com um pipe) e coloca esse grupo em primeiro plano. Ambos os processos receberiam o SIGINT se você pressionar Ctrl-C.Dentro:
O mesmo, mas o grupo de processos não é colocado em primeiro plano (e o shell também não espera por isso, para que você possa inserir outros comandos). Esses processos não receberiam o SIGINT no Ctrl-C, mas poderiam ser suspensos se eles tentassem ler no dispositivo tty.
Mais informações em: Quais são as responsabilidades de cada componente do pseudo-terminal (PTY) (software, lado mestre, lado escravo)?
fonte