Quem decide qual aplicativo recebe o sinal do teclado?

16

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:

  • O usuário pressiona C-c
  • Isso é enviado para o 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 de entrada significa que o sinal é feito no terminal (stty). Eu suponho que isso significa que o próprio terminal está enviando o sinal para o processo. Mas eu também acho que o 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?

    
por calavera.info 10.03.2017 / 10:58

1 resposta

33

Pressionando C enquanto Ctrl é pressionado envia um pressionamento de tecla seguido pelo evento X11 de liberação de tecla para o emulador de terminal.

Após esse evento (geralmente a tecla pressionada), o emulador de terminal grava o byte 0x3 ( ^C ) em seu descritor de arquivo no lado mestre do dispositivo pseudo-tty.

Se a configuração isig termios do dispositivo estiver ativada e se a configuração intr estiver definida para esse byte 0x3, o kernel enviará o sinal SIGINT para 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 arquivo.

Geralmente são shells interativos que criam grupos de processos (com setpgid() ) para trabalhos de shell e decidem qual colocar em primeiro plano (com tcsetpgrp() para definir esse atributo do dispositivo pty) ou não.

Por exemplo, quando você executa no prompt de um shell interativo:

foo | bar

O shell inicia um novo grupo de processos com dois processos (nos quais ele executa foo e bar depois de ter conectado seu stdin / out com um pipe) e coloca esse grupo em primeiro plano. Ambos os processos receberiam o SIGINT se você pressionasse Ctrl-C.

Em:

foo | bar &

Mesmo, mas o grupo de processos não é colocado em primeiro plano (e o shell também não espera por ele para que você possa inserir outros comandos). Esses processos não obteriam o SIGINT no Ctrl-C, mas poderiam ser suspensos se eles tentassem ler o dispositivo tty.

Mais leitura em: Quais são as responsabilidades de cada componente do Pseudo-Terminal (PTY) (software, lado mestre, lado do escravo)? )?

    
por 10.03.2017 / 11:09