为什么有时在CTRL + C之后需要重置控制台


9

当被取消时,某些命令行界面工具会返回损坏的控制台CTRL+C。有时文本是不可见的,或者是图形问题,直到我运行命令为止reset

(我使用bash,但希望它独立于shell。)

这个效果有名字吗?是什么原因造成的,程序员如何在工具中防止这种情况发生?是否有一种策略可以在主要的编程语言中解决该问题?



stty sane为灰胡子
托尔比约恩Ravn的安徒生

Answers:


14

控制台有时需要一个reset(1) (或某些stty(1)命令),因为当某些进程(例如,由Shell启动的程序)终止时,伪终端的状态不会改变。

阅读揭开神秘面纱tty

(我发现伪终端 tty 的处理是Linux中最困难的部分)

是否有一种策略可以在主要的编程语言中解决该问题?

行为规范的程序可以处理终端并更改其模式或线路规则,应尽力避免崩溃并发出适当的调用(请参阅termios(3))以将终端置于正确的状态。顺便说一句,ncursesreadline之类的库很有用(但是您需要适当地调用它们的清理例程)。

参见signal(7)signal-safety(7)。避免代码崩溃很困难。阅读有关未定义行为的信息

一个不完善的解决方法可能是定义一个外壳程序功能,该程序运行您的程序然后执行一个reset(有时可能不合适)。


该解决方法不是很好;有时reset可能会导致stty与原始设置不同的设置。
鲍勃(Bob)

是的,谢谢你指出这一点。我添加了“不完美”。
巴西尔·斯塔林凯维奇

我已经阅读了您的链接,它们很有趣,但是如果您可以为每个Q / A添加指向该部分的指针,这将对您有所帮助。阅读tty的内容后,我先从stty -a > /tmp/test1bash 开始,然后取消了一条命令。终端颜色现在是红色。stty -a > /tmp/test2但是test1test2完全一样。
乔纳斯·斯坦

1

响应此问题并不完全独立于shell。在zsh中,有一个ttyctl内置函数,可以“冻结”或“取消冻结” tty模式。我认为bash中没有类似的东西。将setty在tcsh的命令做同样的事情,但更细粒度:您可以冻结单独的设置。

冻结tty模式只是意味着zsh会记住当前模式,并且如果将来的某个子级更改它,则在该子级挂起或终止时将恢复该模式。

这样可以保护您免受程序崩溃或无法清理终端的某些不良影响。如果要使用进行更改stty,则必须记住要解冻,否则外壳将立即撤消stty所做的任何操作。

reset除了还原stty模式外,它还可以做一些事情,因此您有时可能会需要它,但并不经常需要。


确实:我先在bash中启动stty -a> / tmp / test1,然后再执行一个命令,该命令已取消。终端颜色现在是红色。stty -a> / tmp / test2,但test1和test2完全相同。我用tcsh尝试了同样的方法,但是我无法通过CTRL + C使命令崩溃。颜色保持良好。
乔纳斯·斯坦
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.