【问题标题】:Clean up ncurses mess in terminal after a crash崩溃后清理终端中的 ncurses 混乱
【发布时间】:2012-08-01 06:45:52
【问题描述】:

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

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

【问题讨论】:

  • 大多数终端程序都有一个“重置”选项,可以将终端恢复到初始状态 - 对于这种情况很有用 - 检查程序中的菜单。
  • @PaulR 我正在使用 gnome 终端。重置不起作用;-(

标签: terminal ncurses


【解决方案1】:

命令,

stty sane

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

stty sane ^J

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

【讨论】:

  • 我还是看不到光标。
  • 建议将控件 J 写成如下评论 Thomas Dickey
  • scroll 现在改为转到历史记录中的不同命令,而不是在终端视图中上下滚动
  • 关于“旧终端”的评论不正确。
  • @ThomasDickey 修复并更新了答案。
【解决方案2】:

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

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

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

ncurses 提供了一个信号处理程序来捕获用户发起的信号SIGINT、SIGTERM,并在这些 被捕获时进行清理。它不会尝试捕获 SIGSEGV,因为此时,您的应用程序已死,而尝试将其复活以修复问题会适得其反。

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

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

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

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

resetcontrolJ
stty sanecontrolJ

进一步阅读:

【讨论】:

    【解决方案3】:

    命令

    reset
    

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

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

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

    【讨论】:

    • 我还是看不到光标。
    • 重置命令“应该”这样做,作为它发送的初始化字符串的副作用。终端描述可能不会这样做,但 tput cnorm 更明确,更有可能起作用。
    【解决方案4】:

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

    【讨论】:

    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 1970-01-01
      • 1970-01-01
      • 2019-06-12
      • 2018-03-15
      • 2020-01-25
      • 2018-07-08
      相关资源
      最近更新 更多