我正在使用ncurses绘制TUI。麻烦的是,每当我的程序出现seg-fault时,我的终端就会一团糟。我看不出我在打字。因为我在ssh工作,这很痛苦。我通过使用屏幕减轻了一些效果。
我想知道是否有一个命令会在ncurses中的seg-fault之后刷新我的终端,以便我的终端开始正常运行。
答案 0 :(得分:17)
命令,
stty sane^J
完成了这项工作。
更新:在某些终端stty sane
也可以。
答案 1 :(得分:9)
ncurses(任何curses实现)在运行时将终端模式设置为 raw 和 noecho ,并允许应用程序使用raw and noraw,{{来模拟这些模式3}}功能。它是为了提高性能,以避免在这些模式之间切换时等待。
当应用程序调用{{3}}时,ncurses将恢复终端模式。它也可以为echo and noecho执行此操作,但endwin
的使用频率更高。
如果您的应用程序崩溃或退出而未使用endwin
恢复终端模式,则最明显的问题是您无法看到正在键入的内容,并且按输入不起作用
ncurses提供了一个信号处理程序来捕获用户发起的信号SIGINT
,SIGTERM
,并在捕获这些时进行清理。它不会试图捕获SIGSEGV
,因为在那时,你的应用程序已经死了,试图恢复它来修复它会产生反作用。
有些人可能会建议使用stty sane
来恢复终端模式。这“有效”,但在Unix平台上可能会将 erase 键设置为意外值。它恰好按照Linux和现代BSD系统的预期工作。
然而,除此之外,ncurses通常会重置
如果您的应用程序使用任何这些功能,那么reset
命令是合适的选择。它通常也会清除屏幕(也许不是想要的)。它使用较少的字符:
reset
控制 Ĵ
stty sane
控制 Ĵ
进一步阅读:
endwin
答案 2 :(得分:6)
命令
reset
也在Ubuntu上为我工作,虽然可能有点过分。 最有效的方法是设置一个别名:
alias 'clean'='stty sane;clear;'
在我的.bash_aliases中,因为我发现自己需要在调试中做很多事情。
答案 3 :(得分:4)
为调用SIGSEGV
的{{1}}等编写信号处理程序。
答案 4 :(得分: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'