Terminal 撞车后清理候机楼的杂物

Terminal 撞车后清理候机楼的杂物,terminal,ncurses,Terminal,Ncurses,我正在用ncurses画一张TUI。问题是,每当我的程序出现seg故障时,我的终端就会乱七八糟。我看不清我在打什么。这是一种痛苦,因为我在ssh上工作。我通过使用screen减轻了一些影响 我想知道是否有一个命令可以在ncurses中出现seg故障后刷新我的终端,使我的终端开始正常工作 命令 stty sane 完成了任务。如果enter不起作用,您可以使用^J stty sane ^J 有时CR/LF解释被破坏,因此明确使用^J。为SIGSEGV等编写一个信号处理程序,该处理程序调用end

我正在用ncurses画一张TUI。问题是,每当我的程序出现seg故障时,我的终端就会乱七八糟。我看不清我在打什么。这是一种痛苦,因为我在ssh上工作。我通过使用screen减轻了一些影响

我想知道是否有一个命令可以在ncurses中出现seg故障后刷新我的终端,使我的终端开始正常工作

命令

stty sane
完成了任务。如果enter不起作用,您可以使用
^J

stty sane ^J

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

SIGSEGV
等编写一个信号处理程序,该处理程序调用
endwin()
命令

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

alias 'clean'='stty sane;clear;'
在我的.bash_别名中,我发现自己在调试时需要做很多这项工作。

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

当应用程序调用时,ncurses将恢复终端模式。它也可以用于,尽管
endwin
的使用频率要高得多

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

ncurses提供一个信号处理程序来捕获用户启动的信号
SIGINT
SIGTERM
,并在捕获这些信号时进行清理。它不会试图捕获
SIGSEGV
,因为在这一点上,您的应用程序已经死了,而试图恢复它以修复问题会适得其反

有些人可能建议使用
sttysane
恢复终端模式。这“可行”,但在Unix平台上,可能会将擦除密钥设置为意外值。对于Linux和现代BSD系统来说,它恰如预期的那样工作

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

  • 颜色(终端的默认颜色)
  • 线条图(禁用)
  • 鼠标协议(禁用它)
如果您的应用程序使用了这些功能中的任何一项,则
reset
命令是合适的选择。它通常也会清除屏幕(可能不是想要的)。而且它使用更少的字符:

reset
controlJ
sttysane
controlJ

进一步阅读:

  • in-curs_initscr(3x)
  • 在tput中(1)

我最近在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'

大多数终端程序都有一个“重置”选项,可以将终端恢复到初始状态-在这种情况下很有用-检查程序中的菜单。@PaulR我正在使用gnome终端。重置不起作用-(我仍然看不到光标。建议按以下方式写入控件J注释Thomas Dickeyscroll现在转到历史记录中的其他命令,而不是在终端视图中上下滚动有关“旧终端”的注释不正确。@Thomas Dickey修复并更新了答案。我仍然看不到光标。重置命令“应该”这样做,作为它发送的初始化字符串的副作用。终端描述可能不会这样做,但
tput cnorm
更明确,更有可能工作。下面是如何做的(只确保处理SIGSEGV而不是SIGTERM):这不起作用(实际上会加剧情况)。