¿Por qué la consola necesita a veces un reinicio después de CTRL + C

9

Algunas herramientas de interfaz de línea de comando devuelven una consola rota cuando se cancela CTRL+C. A veces el texto es invisible o hay problemas gráficos hasta que ejecuto el comando reset.

(Uso bash, pero espero que sea independiente del shell).

¿Este efecto tiene un nombre? ¿Qué causa esto y cómo pueden los programadores prevenir esto en las herramientas? ¿Existe una estrategia para abordar este problema en los principales lenguajes de programación?

Jonas Stein
fuente

Respuestas:

14

Una consola a veces necesita un reset(1) (o algún stty(1)comando) porque el estado de un pseudo-terminal no cambia cuando finaliza algún proceso (por ejemplo, un programa iniciado por su shell).

Lee el tty desmitificado .

(Encuentro que el manejo de pseudo-terminales y pseudottys es la parte más difícil de Linux)

¿Existe una estrategia para abordar este problema en los principales lenguajes de programación?

Un programa de buen comportamiento que trate con el terminal y cambie su modo o disciplina de línea debería esforzarse por evitar fallas y emitir las llamadas apropiadas (ver termios (3) ) para poner el terminal en el estado correcto. Por cierto, las bibliotecas como ncurses o readline son útiles (pero debe llamar a sus rutinas de limpieza adecuadamente).

Ver señal (7) y señal de seguridad (7) . Evitar fallas en tu código es difícil. Lea sobre el comportamiento indefinido .

Una solución imperfecta podría ser definir una función de shell que ejecute su programa y luego haga un reset(que a veces puede ser inapropiado).

Basile Starynkevitch
fuente
Esa solución no es genial; a veces resetpuede dar lugar a sttyconfiguraciones diferentes de las originales.
Bob
Sí, gracias por señalar eso. Agregué "imperfecto".
Basile Starynkevitch
He leído sus enlaces, eran interesantes, pero sería útil si pudiera agregar un puntero a una sección para este Q / A cada uno. Después de leer tty desmitificado, comencé stty -a > /tmp/test1en bash y luego un comando, que cancelé. El color del terminal ahora era rojo. stty -a > /tmp/test2pero test1y test2eran exactamente lo mismo.
Jonas Stein
1

Responder a este problema no es completamente independiente de la shell. En zsh, está el ttyctlincorporado, que puede "congelar" o "descongelar" el modo tty. No creo que haya un equivalente en bash. El settycomando en tcsh hace lo mismo, pero más detallado: puede congelar configuraciones individuales.

Congelar el modo tty solo significa que zsh recordará el modo actual, y si algún futuro hijo lo cambia, el modo se restaurará cuando el hijo suspenda o finalice.

Esto lo protegerá de algunos de los efectos negativos de los programas que se bloquean o que de otra manera no limpian el terminal. Debe recordar descongelar si desea realizar un cambio stty, de lo contrario, el shell se deshará inmediatamente de lo que haya sttyhecho.

resethace más que restablecer sttymodos, por lo que aún puede necesitarlo a veces, pero no con frecuencia.


fuente
De hecho: comencé stty -a> / tmp / test1 en bash y luego un comando, que cancelé. El color del terminal ahora era rojo. stty -a> / tmp / test2 pero test1 y test2 fueron exactamente iguales. Intenté lo mismo con tcsh, pero no pude bloquear mi comando con CTRL + C. Los colores se mantuvieron bien.
Jonas Stein