崩溃后清理终端中的 ncurses 混乱

问题描述 投票:0回答:5

我正在使用 ncurses 绘制 TUI。问题是,每当我的程序出现段错误时,我的终端就会变得一团糟。我看不到我正在输入的内容。因为我通过 ssh 工作,所以很痛苦。我通过使用屏幕减轻了一些影响。

我想知道是否有一个命令可以在 ncurses 出现段错误后刷新我的终端,以便我的终端开始正常运行。

terminal ncurses
5个回答
29
投票

命令

stty sane
完成了这项工作。如果输入不起作用,您可以使用
^J

stty sane ^J

有时 CR/LF 解释会被破坏,因此请明确使用

^J


18
投票

ncurses(任何curses实现)在运行时将终端模式设置为rawnoecho,并允许应用程序使用raw和norawecho和noecho函数来模拟这些模式。这样做是为了提高性能,以避免在这些模式之间切换时等待。

当应用程序调用

endwin
时,ncurses 会恢复终端模式。它也可以对 reset_shell_mode 执行此操作,尽管
endwin
使用得更频繁。

如果您的应用程序崩溃,或退出而未使用

endwin
恢复终端模式,最明显的问题是您看不到正在键入的内容,并且按 enter 不起作用。

ncurses 提供了一个信号处理程序来捕获用户发起的信号

SIGINT
SIGTERM
,并在捕获 那些 时进行清理。它不会尝试捕获
SIGSEGV
,因为此时您的应用程序已死亡,尝试复活它来修复问题会适得其反。

有些人可能建议使用

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

但是,除此之外,ncurses 通常会重置

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

如果您的应用程序使用这些功能中的任何一个,那么

reset
命令是合适的选择。它通常也会清除屏幕(也许不是我们想要的)。而且它使用的字符更少:

reset
控制J
stty sane
控制J

进一步阅读:


7
投票

命令

reset

在 Ubuntu 上也为我工作,但可能有点过头了。 最有效的方法是设置一个别名,例如:

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

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


4
投票

SIGSEGV
等编写一个调用
endwin()
的信号处理程序。


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'
© www.soinside.com 2019 - 2024. All rights reserved.