[英]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.