Por que o console às vezes precisa de uma redefinição após CTRL + C

9

Algumas ferramentas da interface da linha de comandos retornam um console quebrado quando canceladas por CTRL+C. Às vezes, o texto é invisível ou há problemas gráficos até que eu execute o comando reset.

(Eu uso o bash, mas espero que seja independente do shell.)

Esse efeito tem um nome? O que causa isso e como os programadores podem impedir isso nas ferramentas? Existe uma estratégia de como esse problema é tratado nas principais linguagens de programação?

Jonas Stein
fonte
stty sanepara as barbas cinzentas
Thorbjørn Ravn Andersen 11/11

Respostas:

14

Às vezes, um console precisa de um reset(1) (ou de algum stty(1)comando) porque o estado de um pseudo-terminal não muda quando algum processo (por exemplo, um programa iniciado pelo seu shell) termina.

Leia o tty desmistificado .

(Acho que a manipulação de pseudo-terminais e pseudottys é a parte mais difícil do Linux)

Existe uma estratégia de como esse problema é tratado nas principais linguagens de programação?

Um programa bem-comportado que lide com o terminal e altere seu modo ou disciplina de linha deve tentar evitar batidas e emitir as chamadas apropriadas (consulte os termos (3) ) para colocar o terminal no estado correto. BTW, bibliotecas como ncurses ou readline são úteis (mas você precisa chamar suas rotinas de limpeza adequadamente).

Veja o sinal (7) e sinal de segurança (7) . É difícil evitar falhas no seu código. Leia sobre comportamento indefinido .

Uma solução alternativa imperfeita poderia ser definir uma função shell que executa o programa e executa um reset(que às vezes pode ser inapropriado).

Basile Starynkevitch
fonte
Essa solução alternativa não é ótima; Às vezes, resetpode resultar em sttyconfigurações diferentes das originais.
Bob
Sim, obrigado por apontar isso. Eu adicionei "imperfeito".
Basile Starynkevitch 11/11
Eu li seus links, eles eram interessantes, mas seria útil, se você pudesse adicionar um ponteiro a uma seção para esta pergunta / resposta cada. Depois de ler tty desmistificado, iniciei stty -a > /tmp/test1no bash e depois um comando, que cancelei. A cor do terminal estava agora vermelha. stty -a > /tmp/test2mas test1e test2eram exatamente iguais.
Jonas Stein
1

Responder a esse problema não é completamente independente do shell. No zsh, existe o ttyctlbuilt-in, que pode "congelar" ou "descongelar" o modo tty. Eu não acho que exista um equivalente no bash. O settycomando no tcsh faz a mesma coisa, mas com mais detalhes: você pode congelar configurações individuais.

Congelar o modo tty significa apenas que o zsh lembrará o modo atual e, se algum filho futuro o alterar, o modo será restaurado quando o filho suspender ou terminar.

Isso o protegerá de alguns dos efeitos negativos dos programas que travam ou que não conseguem limpar o terminal. Você deve se lembrar de descongelar se quiser fazer uma alteração stty, caso contrário o shell desfará imediatamente o que você sttyfez.

resetfaz mais do que restaurar sttymodos, então você ainda pode precisar algumas vezes, mas não com frequência.


fonte
Na verdade: iniciei stty -a> / tmp / test1 no bash e depois um comando, que cancelei. A cor do terminal estava agora vermelha. stty -a> / tmp / test2, mas test1 e test2 eram exatamente os mesmos. Tentei o mesmo com o tcsh, mas não consegui interromper o comando CTRL + C. As cores continuaram bem.
Jonas Stein