在崩溃后清理终端中的ncurses乱码

时间:2012-08-01 06:45:52

标签: terminal ncurses

我正在使用ncurses绘制TUI。麻烦的是,每当我的程序出现seg-fault时,我的终端就会一团糟。我看不出我在打字。因为我在ssh工作,这很痛苦。我通过使用屏幕减轻了一些效果。

我想知道是否有一个命令会在ncurses中的seg-fault之后刷新我的终端,以便我的终端开始正常运行。

5 个答案:

答案 0 :(得分:17)

命令,

stty sane^J

完成了这项工作。

更新:在某些终端stty sane也可以。

答案 1 :(得分:9)

ncurses(任何curses实现)在运行时将终端模式设置为 raw noecho ,并允许应用程序使用raw and noraw,{{来模拟这些模式3}}功能。它是为了提高性能,以避免在这些模式之间切换时等待。

当应用程序调用{​​{3}}时,ncurses将恢复终端模式。它也可以为echo and noecho执行此操作,但endwin的使用频率更高。

如果您的应用程序崩溃或退出而未使用endwin恢复终端模式,则最明显的问题是您无法看到正在键入的内容,并且按输入不起作用

ncurses提供了一个信号处理程序来捕获用户发起的信号SIGINTSIGTERM,并在捕获这些时进行清理。它不会试图捕获SIGSEGV,因为在那时,你的应用程序已经死了,试图恢复它来修复它会产生反作用。

有些人可能会建议使用stty sane来恢复终端模式。这“有效”,但在Unix平台上可能会将 erase 键设置为意外值。它恰好按照Linux和现代BSD系统的预期工作。

然而,除此之外,ncurses通常会重置

  • 颜色(终端的默认颜色)
  • 画线(禁用)
  • 鼠标协议(禁用它)

如果您的应用程序使用任何这些功能,那么reset命令是合适的选择。它通常也会清除屏幕(也许不是想要的)。它使用较少的字符:

reset 控制 Ĵ
   stty sane 控制 Ĵ

进一步阅读:

答案 2 :(得分:6)

命令

reset

也在Ubuntu上为我工作,虽然可能有点过分。 最有效的方法是设置一个别名:

alias 'clean'='stty sane;clear;'

在我的.bash_aliases中,因为我发现自己需要在调试中做很多事情。

答案 3 :(得分:4)

为调用SIGSEGV的{​​{1}}等编写信号处理程序。

答案 4 :(得分:0)

我最近在Mac OSX终端上遇到了这个问题。遵循以下命令是有效的,但stty sane却没有。

stty discard '^O'
stty dsusp '^Y'
stty eof '^D'
stty eol '^@'
stty eol2 '^@'
stty erase '^?'
stty intr '^C'
stty kill '^U'
stty lnext '^V'
stty min 1
stty quit '^\'
stty reprint '^R'
stty start '^Q'
stty status '^T'
stty stop '^S'
stty susp '^Z'
stty time 0
stty werase '^W'