我正在使用 ncurses 绘制 TUI。问题是每当我的程序出现段错误时,我的终端就会一团糟。我看不到我在输入什么。因为我在 ssh 上工作,所以很痛苦。我通过使用屏幕减轻了一些影响。
我想知道是否有一个命令会在 ncurses 中的 seg-fault 之后刷新我的终端,以便我的终端开始正常运行。
命令,
stty sane
做了这项工作。如果输入不起作用,您可以使用^J
.
stty sane ^J
有时 CR/LF 解释被破坏所以使用^J
显式。
ncurses(任何 curses 实现)在运行时将终端模式设置为raw和noecho,并允许应用程序使用raw 和 noraw、echo 和 noecho函数模拟这些模式。它这样做是为了提高性能,以避免在这些模式之间切换时等待。
当应用程序调用endwin
时,ncurses 恢复终端模式。它也可以为reset_shell_mode执行此操作,但endwin
使用频率更高。
如果您的应用程序崩溃或退出而没有使用 恢复终端模式endwin
,最明显的问题是您看不到正在输入的内容,并且按下enter不起作用。
ncurses 提供了一个信号处理程序来捕获用户启动的信号SIGINT
, , 并在捕获这些SIGTERM
信号时进行清理。它不会尝试捕捉,因为在那时,您的应用程序已经死了,并且试图复活它来修复东西会适得其反。SIGSEGV
有些人可能会建议使用stty sane
来恢复终端模式。这“有效”,但在 Unix 平台上可能会将您的擦除键设置为意外值。对于 Linux 和现代 BSD 系统,它恰好可以正常工作。
但是,除此之外,ncurses 通常会重置
如果您的应用程序使用这些功能中的任何一个,则该reset
命令是合适的选择。它通常也会清除屏幕(也许不是想要的)。它使用的字符更少:
reset
controlJ
stty sane
controlJ
进一步阅读:
reset
- 重新初始化命令
reset
在 Ubuntu 上也为我工作,不过可能有点矫枉过正。最有效的是设置一个别名,如:
alias 'clean'='stty sane;clear;'
在我的 .bash_aliases 中,因为我发现自己在调试中需要做很多事情。
SIGSEGV
为调用 的 等编写一个信号处理程序endwin()
。
我最近在 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'