Lista de sinais gerados no terminal (por exemplo, Ctrl-C -> SIGINT)

31

Onde posso encontrar uma lista completa das combinações de teclado que enviam sinais no Linux?

Por exemplo:

  • Ctrl+ C- SIGINT
  • Ctrl+ \- SIGQUIT
Tom Hale
fonte
2
O "teclado" não envia nenhum sinal, a disciplina de linha envia. Descubra o que é uma disciplina de linha e leia man 1 stty.
Satō Katsura
@SatoKatsura A disciplina de linha é como um driver de teclado.
Gilles 'SO- stop be evil'
@ Gilles Na verdade não. O driver do teclado lida com scancodes e similares. A disciplina linha é uma espécie de maior cola nível que dá a aplicação de uma visão unificada sobre muitas outras coisas, como linhas de modem, adaptadores USB-to-serial, dispositivos HID, etc.
Satō Katsura
@SatoKatsura É uma parte do sistema operacional que fica entre o aplicativo e o teclado. Em outras palavras, faz parte do driver do teclado. Com um terminal de hardware (como um vt100), é a única transformação da entrada do teclado feita pelo computador em oposição ao próprio terminal.
Gilles 'SO- stop be evil'

Respostas:

27

A disciplina de linha N_TTY do Linux envia apenas três sinais diferentes: SIGINT, SIGQUIT e SIGTSTP. Por padrão, os seguintes caracteres de controle produzem os sinais:

  • Ctrl+ C- SIGINT
  • Ctrl+ \- SIGQUIT
  • Ctrl+ Z- SIGTSTP
Johan Myréen
fonte
Hmm, e Ctrl-S e Ctrl-Q? Você tem uma referência para isso?
Tom Hale
6
Nenhum sinal está envolvido quando você pressiona Ctrl-S ou Ctrl-Q. Eles apenas limitam o fluxo de caracteres, impedindo-os de alcançar o processo de consumo. Eventualmente, quando os buffers forem preenchidos, o processo de produção será bloqueado na chamada do sistema de gravação até que Ctrl-Q libere o fluxo. Observe que é normal que a chamada para gravação possa bloquear mesmo sem o Ctrl-S: se o processo de recebimento demorar para consumir os dados enviados, por exemplo, porque ele está gastando a maior parte do tempo processando dados já recebidos em vez de ler novos dados .
Johan Myréen
11
man stty | grep -C1 signalé uma fonte para esses três, sendo os únicos sinais gerados pelo terminal.
Tom Hale
@ TomHale ... Exceto "sinais de controle do modem" são sinais elétricos. :) Realmente, SIGINT, SIGQUITe SIGTSTPsão a única sinais "habituais" enviada pela disciplina line. No BSD você também tem coisas do tipo SIGINFO, mas isso não é padrão.
Satō Katsura
8

Você pode usar sttypara verificar ou alterar os caracteres que geram sinais.

$ stty -a | grep -Ewoe '(intr|quit|susp) = [^;]+'
intr = ^C
quit = ^\
susp = ^Z

intr(interromper) gera SIGINT, quitgera SIGQUIT, susp(suspende) gera SIGTSTP. stty -atambém mostrará coisas como start = ^Q; stop = ^S;e erase = ^?(backspace), que não enviam sinais, mas afetam a camada terminal.

Plain sttymostrará as configurações não padrão e, por exemplo stty intr ^Q, alteraria o caractere de interrupção para em ^Qvez de ^C.

Eu acho que ^L(feed de formulário, nova página) não é um recurso terminal, mas um caractere frequentemente usado pelos aplicativos para solicitar um redesenho da exibição, verificando novamente o tamanho da janela ao mesmo tempo.

ilkkachu
fonte
11
^Ltem um significado diferente para diferentes aplicações. Na maioria dos cursesaplicativos baseados em (tais como vim, less, mutt, mc, etc.) que obriga um redesenho completo (portanto, re-verificar o tamanho da janela), mas em conchas ( bashetc.) ele só limpa a tela. Não há SIGWINCHenvolvido.
Satō Katsura