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 estiver intr
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 (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 foo
e bar
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:
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)?