繁体   English   中英

在崩溃后清理终端中的ncurses乱码

[英]Clean up ncurses mess in terminal after a crash

我正在使用ncurses绘制TUI。 麻烦的是,每当我的程序出现seg-fault时,我的终端就会一团糟。 我看不出我在打字。 因为我在ssh工作,这很痛苦。 我通过使用屏幕减轻了一些效果。

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

命令,

stty sane^J

做了这个工作。

更新:在某些终端上, stty sane也有效。

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

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

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

ncurses提供了一个信号处理程序来捕获用户发起的信号SIGINTSIGTERM ,并在捕获它们时进行清理。 它并没有试图捕获SIGSEGV因为在那一点上,你的应用程序已经死了,试图恢复它来修复东西会产生反作用。

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

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

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

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

reset 控制 J.
stty sane control J

进一步阅读:

命令

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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM