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:

  • 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?

calavera.info
fonte
11
Não é uma resposta por si só, mas vale a pena ler: o TTY desmistificado , por lft.
duskwuff

Respostas:

33

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 isigconfiguração termios do dispositivo estiver intrativada 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 (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 é executado fooe bardepois 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:

foo | bar &

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)?

Stéphane Chazelas
fonte
2
Obrigado pela resposta rica. Vou tentar reformular o núcleo da resposta para ter certeza de que o entendo: O sinal é enviado pelo kernel, que está monitorando o próprio dispositivo tty quanto à entrada configurada nos atributos do dispositivo (por quem quiser configurá-lo) e o kernel o envia ao grupo de processos que também é configurado nos atributos do dispositivo (principalmente pelo shell como uma das tarefas de um líder de sessão). Eu espero que isto esteja correto.
calavera.info
11
@ calavera.info, sim, está correto. No caso de um terminal real no final de um cabo serial, o kernel está procurando pelo byte de 0x3 proveniente do fio. Para um pseudo-terminal, o lado mestre substitui o fio. E o kernel está procurando esse byte de 0x3 nos bytes enviados pelo emulador de terminal. Veja também a edição com um link para outra sessão de perguntas e respostas com mais detalhes (como o fato de que o processamento do kernel faz parte de um design modular que é feito quando o dispositivo é usado como um dispositivo "terminal" ( disciplina da linha de terminal ).
Stéphane Chazelas
A pergunta não dizia terminal , em vez de emulador de terminal ? Suponho que não faz muita diferença, dado que a função do emulador é atuar tanto como um terminal possível ...
Toby Speight
2
@ Toby, sim, como quase ninguém usa terminal real hoje em dia, presumi que o OP significava emuladores de terminal (muitos deles são chamados de "terminal"). Veja também meu comentário acima do seu e as perguntas e respostas vinculadas para obter mais detalhes.
Stéphane Chazelas
11
@TobySpeight Sim, eu estava perguntando sobre um terminal porque estou lidando com o terminal real através da linha serial, mas a resposta e os comentários a seguir foram completamente válidos para ambos os casos.
21417 Calebe.info