Relações entre caracteres de controle, sinais e terminal

5

Quais são as relações entre caracteres de controle e sinais? Ou eles não estão relacionados?

Os caracteres de controle são recebidos por um terminal?

Depois que um terminal recebe um caractere de controle, o terminal envia um sinal para um processo de uma das possíveis ações do terminal para o caractere de controle recebido?

Por exemplo,

no Linux, em um terminal, Ctrl + C terminará um processo em primeiro plano em execução. Em ASCII, Ctrl + C é um caractere de controle que significa "Fim do texto" .

Em ASCII, Ctrl + D é um caractere de controle que significa fim de transmissão. O caractere de controle faz o terminal enviar algum sinal para algum processo?

    
por Tim 03.03.2016 / 21:02

2 respostas

9

O driver de terminal (parte do sistema operacional) estabelece a relação entre caracteres especiais e sinais. Suas configurações de terminal , por exemplo, usando stty , são o que ele usa para decidir o que (se houver) fazer com caracteres que você digita. Você pode reatribuir esses caracteres especiais conforme necessário com algumas ressalvas:

  • apenas um caractere especial por função
  • apenas caracteres de byte único são usados

controle C e controle D são convencionais : enquanto algumas aplicações pode codificar esses valores, o driver do terminal não requer isso.

O driver do terminal é software, não faz parte do seu terminal . Para alguns teclados você pode encontrar diferentes atribuições de caracteres especiais mais convenientes do que outras (e para sistemas operacionais diferentes, algumas escolhas dos valores padrão para os caracteres especiais podem ser diferentes).

Leitura adicional:

por 03.03.2016 / 22:59
3

Caracteres e sinais de controle estão relacionados. Você pode ver qual é a correspondência entre sinais e caracteres com o comando stty -a em um terminal. Um servidor RHEL que eu posso acessar diz:

-bash-3.2$ stty -a
speed 38400 baud; rows 24; columns 135; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

Algumas delas estão relacionadas ao TTY e o que ele faz para inserir, outras coisas para sinais. As partes para sinais:

intr = ^C; quit = ^\; susp = ^Z;

Isso significa que SIGINT é control-C, SIGQUIT é control-backslash e SIGSTOP é control-Z. Você pode transferir qualquer um ou todos esses, se quiser. Veja man stty .

Os outros caracteres de controle como erase ou werase são interceptados e usados pelo próprio driver de terminal. Como quando você retrocede, o driver do terminal apaga um caractere da tela e do fluxo de entrada. O "modo" do driver do terminal (cru ou cozido, possivelmente parcialmente cozido) também faz a diferença. Editores de texto como vim e emacs fazem uso pesado de caracteres de controle, e eles não obtêm um SIGINT ou SIGQUIT ou o que quer que seja quando você digita esses caracteres de controle. Um programa pode definir o TTY para "modo bruto" e apenas ler os bytes sem interpretação pelo driver do terminal.

    
por 03.03.2016 / 23:04