(Esta é uma tentativa de esclarecer e responder a pergunta, mas melhorias e correções são bem-vindas).
Primeiro, vamos remover o sudo
e o &
+ fg
do cenário - já que eles não estão afetando a estação (eu presumi que você os usou principalmente para obter o PID). A questão então se torna: 1) como um processo rodando em primeiro plano de um terminal recebe SIGINT; 2) o que muda quando o terminal é um pseudo-terminal usando X11 (por exemplo, Xterm).
-
A entrega de SIGINT (e SIGQUIT, SIGTSTP) é gerada pelo driver de terminal de controle do kernel, quando ele intercepta um caractere CTRL-C, e é por isso que você vê
SI_KERNEL
como a origem. Isso acontece independentemente do X11 ou dos pseudo-terminais. É bem ilustrado em "Programação Avançada no Unix Environment 2nd Edition (APUE2)", Figura 9.7, página 272 (não vou colá-lo aqui por motivos de copyright, mas tenho certeza que ele pode ser encontrado). É explicado na página 275, seção "9.8 Job Control". O código relevante do kernel do Linux é provavelmente o seguinte: link -
Agora adicionando pseudo-terminais à mixagem: o código do kernel do psudeo-terminal ainda usa o código de terminal padrão (mencionado acima) - assim quando o lado 'mestre' do PTY (o X-terminal) recebe o X11 key-event de "CTRL-C", e envia para o escravo PTY, o caractere é detectado pelo drive do terminal do kernel, e envia SIGINT para o grupo de processos em primeiro plano (sudo no seu caso). Isso é ilustrado em APUE2, Figura 19.1, página 676.
Na página APUE2 706 há um pequeno parágrafo "Geração de Sinal" mencionando que os sinais podem ser enviados diretamente pelo mestre PTY usando ioctl(2)
(por exemplo, link ), mas acredito que este não é o caso aqui.
Comentários bem-vindos.