Como descongelar após acidentalmente pressionar Ctrl-S em um terminal?

637

É uma situação que aconteceu com muita frequência para mim: depois de pressionar (com uma intenção diferente) Ctrl-S em um terminal, a interação (entrada ou saída) com ele é congelada. Provavelmente é uma espécie de "scroll lock" ou qualquer outra coisa.

Como faço para descongelar o terminal depois disso?

(Desta vez, eu tenho trabalhado com apt-shell dentro de um bash dentro de urxvt - não tenho certeza qual deles é responsável pelo tratamento especial de Ctrl-S : I estava pesquisando o histórico de comandos de trás para frente com Cr , como de costume para readline, mas depois eu queria voltar "para frente" através do histórico com o usual - pelo menos no Emacs - Cs ( 1 , < href="https://unix.stackexchange.com/questions/4079/put-history-command-onto-command-line-without-executing-it/4086#4086"> 2 , 3 ), mas isso causou o terminal para congelar.Bem, rolagem / paginação para ver as coisas passadas ainda funciona no terminal, mas nenhuma interação com os processos executados lá.

    
por imz -- Ivan Zakharyaschev 27.04.2011 / 14:19

2 respostas

742

Ctrl - Q

Para desabilitar isso, coloque stty -ixon em um script de inicialização. Para permitir que qualquer chave faça as coisas fluírem novamente, use stty ixany .

ps: Não é nem o terminal nem o shell que faz isso, mas o driver de terminal do sistema operacional.

    
por 27.04.2011 / 14:29
333

Ctrl - Q é de fato a resposta. Eu pensei em lançar um pequeno histórico disso que é muito longo para caber nas margens de resposta correta do ak2 .

De volta à idade das trevas, um terminal era um grande equipamento conectado a um dispositivo remoto (originalmente outro terminal, porque os teletipos eram muito mais fáceis de aprender a operar do que uma tecla telegráfica) por um fio longo ou por linhas telefônicas. com modems. Quando o Unix estava em desenvolvimento, o código ASCII já estava bem estabelecido (embora o código EBCDIC concorrente da IBM ainda fosse uma força a ser considerada).

Os primeiros terminais mantinham um registro impresso de cada caractere recebido. Contanto que os personagens chegassem não mais rápido do que a cabeça de impressão poderia digitá-los, pelo menos. Mas assim que os terminais baseados em CRT eram possíveis, surgiu o problema de apenas 25 linhas caberem no CRT, e 25 linhas de 80 caracteres representavam RAM suficiente que ninguém pensava seriamente em fornecer mais RAM para caracteres que tinham rolado para fora do topo a tela.

Portanto, foi necessária alguma convenção para sinalizar que o final do envio deve parar para que o leitor alcance o atraso.

O código ASCII de 7 bits possui 33 pontos de código dedicados a caracteres de controle (0 a 31 e 127). Algumas delas tinham propósitos bem estabelecidos, como NUL (líder de fita de papel em branco para encadeamentos, lacunas e emendas), DEL (caracteres "riscados" em fita de papel indicados ao perfurar todos os sete orifícios), BEL (ding!), CR , LF e TAB . Mas quatro foram definidos explicitamente para controlar o próprio dispositivo de terminal ( DC1 to DC4 também conhecido como Ctrl + Q, Ctrl + R, Ctrl + S e Ctrl + T).

Meu melhor palpite é que alguns engenheiros pensaram que (como mnemônicos), "S" para "Parar" e "Q" para "Continuar" não eram muito ruins, e DC3 significa "por favor, parem de enviar "e DC1 significa" ok, continue enviando agora ".

Mesmo essa convenção já estava bem estabelecida quando a Unix estava deixando o ninho na Bell Labs para sair ao mundo.

A convenção é conhecida como controle de fluxo de software e é extremamente comum em dispositivos seriais reais. Não é fácil implementá-lo corretamente, pois impede o uso de qualquer um desses caracteres para qualquer outra finalidade no canal de comunicação, e o sinal de parada deve ser tratado antes de qualquer caractere recebido pendente para evitar o envio de mais do que o terminal receptor. manusear.

Se for prático, usar sinais adicionais fora da banda do fluxo de dados serial para controle de fluxo é muito preferido. Em conexões com fio direto que podem arcar com os fios de sinal adicionais, você encontrará o handshake de hardware em uso, o que libera esses caracteres para outros usos.

Naturalmente, a janela de terminal de hoje não está usando uma porta serial física real, tem barras de rolagem e realmente não precisa de handshaking de software. Mas a convenção persiste.

Eu me lembro da afirmação de que Richard Stallman recebeu reclamações sobre seu mapeamento Ctrl + S para pesquisa incremental nas primeiras versões do emacs, e que ele não era simpático a nenhum usuário que dependesse de um fluxo de software de 7 bits conexão controlada.

    
por 27.04.2011 / 23:30