[英]Clean up ncurses mess in terminal after a crash
我正在使用ncurses绘制TUI。 麻烦的是,每当我的程序出现seg-fault时,我的终端就会一团糟。 我看不出我在打字。 因为我在ssh工作,这很痛苦。 我通过使用屏幕减轻了一些效果。
我想知道是否有一个命令会在ncurses中的seg-fault之后刷新我的终端,以便我的终端开始正常运行。
命令,
stty sane^J
做了这个工作。
更新:在某些终端上, stty sane
也有效。
ncurses(任何curses实现)在运行时将终端模式设置为raw和noecho ,并允许应用程序使用raw和noraw , echo和noecho函数来模拟这些模式 。 它是为了提高性能,以避免在这些模式之间切换时等待。
当应用程序调用endwin
,ncurses将恢复终端模式。 它也可以为reset_shell_mode执行此操作 ,但更常使用endwin
。
如果您的应用程序崩溃或退出而没有使用endwin
恢复终端模式,最明显的问题是您无法看到您正在键入的内容,并且按Enter键不起作用。
ncurses提供了一个信号处理程序来捕获用户发起的信号SIGINT
, SIGTERM
,并在捕获它们时进行清理。 它并没有试图捕获SIGSEGV
因为在那一点上,你的应用程序已经死了,试图恢复它来修复东西会产生反作用。
有些人可能会建议使用stty sane
来恢复终端模式。 这“有效”,但在Unix平台上可能会将您的擦除密钥设置为意外值。 它恰好像Linux和现代BSD系统一样工作。
但是,除此之外,ncurses通常会重置
如果您的应用程序使用任何这些功能,则reset
命令是合适的选择。 它通常也会清除屏幕(也许不是想要的)。 它使用更少的字符:
reset
控制 J.
stty sane
control J
进一步阅读:
reset
- 重新初始化 命令
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.