簡體   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