Por que o console precisa, às vezes, de um reset após CTRL + C?

9

Algumas ferramentas da interface de linha de comando retornam um console quebrado quando são canceladas por CTRL+C . Às vezes o texto é invisível ou há problemas gráficos até eu executar 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 este problema é abordado nas principais linguagens de programação?

    
por Jonas Stein 11.11.2017 / 15:26

2 respostas

14

Um console às vezes precisa de um reset(1) (ou 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 .

(eu acho o manuseio de pseudo-terminais e pseudottys a parte mais difícil do Linux)

Is there a strategy how this problem is addressed in the major programming languages?

Um programa bem-comportado lidando com o terminal e mudando seu modo ou disciplina de linha deve tentar evitar quebras e emitir as chamadas apropriadas (veja termios(3) ) para colocar o terminal no estado certo. BTW, bibliotecas como ncurses ou readline são úteis (mas você precisa chamar as rotinas de limpeza apropriadamente).

Veja sinal (7) e sinal-segurança (7) . Evitar bater em seu código é difícil. Leia sobre comportamento indefinido .

Uma solução imperfeita poderia ser definir uma função de shell que executa seu programa, em seguida, faz um reset (que às vezes pode ser inadequado).

    
por 11.11.2017 / 15:31
2

Responder a este problema não é completamente independente do shell. Em zsh, há o ttyctl builtin, que pode "congelar" ou "descongelar" o modo tty. Eu não acho que haja um equivalente no bash. O comando setty no tcsh faz a mesma coisa, mas é mais refinado: você pode congelar configurações individuais.

Congelar o modo tty significa apenas que o zsh irá se lembrar do modo atual, e se algum filho futuro o alterar, o modo será restaurado quando a criança for suspensa ou finalizada.

Isto irá protegê-lo de alguns dos maus efeitos de programas que falharem ou falharem na limpeza do terminal. Você deve se lembrar de descongelar se quiser fazer uma alteração com stty , caso contrário, o shell irá imediatamente desfazer qualquer que seja seu stty .

reset faz mais do que restaurar os modos stty , por isso você pode precisar disso às vezes, mas não com frequência.

    
por 11.11.2017 / 23:11