15

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

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

4

5 回答 5

27

命令,

stty sane

做了这项工作。如果输入不起作用,您可以使用^J.

stty sane ^J

有时 CR/LF 解释被破坏所以使用^J显式。

于 2012-08-01T07:06:58.870 回答
17

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

当应用程序调用endwin时,ncurses 恢复终端模式。它也可以为reset_shell_mode执行此操作,但endwin使用频率更高。

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

ncurses 提供了一个信号处理程序来捕获用户启动的信号SIGINT, , 并在捕获这些SIGTERM信号时进行清理。它不会尝试捕捉,因为在那时,您的应用程序已经死了,并且试图复活它来修复东西会适得其反。SIGSEGV

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

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

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

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

resetcontrolJ
stty sanecontrolJ

进一步阅读:

于 2016-04-19T12:33:34.813 回答
7

命令

reset

在 Ubuntu 上也为我工作,不过可能有点矫枉过正。最有效的是设置一个别名,如:

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

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

于 2013-07-03T15:59:59.540 回答
4

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

于 2012-08-01T07:10:58.903 回答
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'
于 2019-08-29T19:40:05.960 回答