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