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

15

我正在使用ncurses绘制TUI。问题是,每当我的程序出现段错误时,我的终端就会乱掉。我看不到我正在输入的内容。这很痛苦,因为我正在通过ssh工作。我通过使用screen来减轻一些影响。

我想知道是否有一个命令可以在ncurses发生段错误后刷新我的终端,使其恢复正常。


大多数终端程序都有一个“重置”选项,可以将终端恢复到初始状态 - 在这种情况下非常有用 - 请检查您的程序菜单。 - Paul R
@PaulR 我正在使用 gnome-terminal。重置无法完成工作 ;-( - Dilawar
5个回答

28

命令,

stty sane

完成了工作。如果回车键无效,您可以使用 ^J

stty sane ^J
有时候 CR/LF 的解释可能会出问题,所以要明确使用 ^J

1
我仍然看不到光标。 - AlwaysLearning
建议将J控件编写为以下注释Thomas Dickey所示 - serup
现在滚动条会跳转到历史命令中的不同位置,而不是在终端视图中上下滚动。 - mekb
“关于“旧终端”的评论是不正确的。” - Thomas Dickey

18

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

当应用程序调用endwin时,ncurses会恢复终端模式。它还可以为reset_shell_mode执行此操作,但endwin更常用。

如果您的应用程序崩溃或退出而没有使用endwin恢复终端模式,则最明显的问题是您无法看到自己输入的内容,并且按下enter键无效。

ncurses提供了一个信号处理程序来捕获用户发起的信号SIGINTSIGTERM,并在捕获这些信号时进行清理。它不会尝试捕获SIGSEGV,因为此时您的应用程序已经停止运行,试图复活它以修复问题是没有意义的。

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

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

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

    resetcontrolJ
    stty sanecontrolJ

    进一步阅读:


    7
    命令
    reset
    

    在Ubuntu上也对我有用,但可能有点过度。 最好的方法是设置一个别名,例如:

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

    我在我的 .bash_aliases 文件中添加了这个命令,因为我发现在调试中经常需要使用它。


    我仍然看不到光标。 - AlwaysLearning
    重置命令“应该”这样做,作为发送的初始化字符串的副作用。终端描述可能不会这样做,但**tput cnorm**更明确,更有可能奏效。 - Thomas Dickey

    4

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


    以下是如何处理SIGSEGV而不是SIGTERM的方法:http://www.linuxquestions.org/questions/programming-9/ncurses-dev-254581-print/ - AlwaysLearning
    那样做不行(实际上会加剧情况)。 - Thomas Dickey

    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'
    

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接