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

Dil*_*war 12 terminal ncurses

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

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

Dil*_*war 20

命令,

stty sane^J
Run Code Online (Sandbox Code Playgroud)

做了这个工作.

更新:在某些终端stty sane也有效.


Tho*_*key 11

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

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

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

ncurses的提供信号处理程序来捕获用户发起的信号SIGINT,SIGTERM和将清理时那些被发现.它并没有试图捕获,SIGSEGV因为在那一点上,你的应用程序已经死了,并试图恢复它来修复东西是适得其反的.

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

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

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

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

resetcontrolJ
stty sanecontrolJ

进一步阅读:


JDo*_*ong 7

命令

reset
Run Code Online (Sandbox Code Playgroud)

在Ubuntu上也为我工作,虽然可能有点过分.什么最有效的是设置一个别名,如:

alias 'clean'='stty sane;clear;'
Run Code Online (Sandbox Code Playgroud)

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