Estou tentando ler o código-fonte para entender qual processo é responsável por esses mapeamentos, mas ainda não consigo descobrir. Alguém pode me dar uma dica sobre qual código é relativo a ele?
código fonte: agetty+login(util-linux project) , systemd
Nenhum processo é responsável por esse mapeamento. Esta é uma função de driver de dispositivo, parte do kernel, ctrl-ccomo padrão.
ctrl-cé mapeado
SIGINT
pelo dispositivo tty (ou pty) e será enviado aos processos de primeiro plano para o terminal de controle.O Systemd conecta o agetty ao dispositivo tty e o inicia, então o agetty inicializa o dispositivo tty (com a versão de chamada do sistema de stty ou tcsetattr) e aguarda a entrada e, eventualmente, o login do exec()s.
Se, por exemplo, tcsetattr for usado, ele aplica a estrutura termios ao tty, que inclui o
c_cc
array, que inclui os caracteres especiais que o tty mapeia para ações (incluindo edição de linha e sinais e outras coisas), incluindoVINTR
qual padrão é ctrl-c, e também define sinalizadores de modo que permitem que esses caracteres sejam interpretados pelo tty.Algum tempo depois, aplicativos (como bash ou vim ou emacs) também manipulariam termios e alterariam os bits de modo para possivelmente desabilitar os caracteres de edição de linha (e então emulá-los) ou até mesmo desabilitar alguns ou todos os caracteres de interrupção para que eles possam ser lido literalmente e usado como o aplicativo desejar.
Eu acho que o mapeamento de sinal padrão é tratado pelo kernel do Linux, mas não pelos processos iniciais (init, agetty, login ou bash).
No entanto, pode ser definido/obtido por
termios
bibliotecas associadas.Para verificar minha suposição, escrevi um programa de teste simples (test.c) e o fiz como o primeiro processo invocado pelo kernel (assim como o init). O código da seguinte forma:
Em seguida, fiz isso como
init
e reiniciei o sistema, o programa exibiria:Esses dois valores correspondem respectivamente a
^C
e^Z
. O que significa que o kernel faz o trabalho por padrão.