ncurses を使用して TUI を描画しています。問題は、プログラムがセグメンテーション フォールトを取得するたびに、端末が混乱したままになることです。何を入力しているのか見えません。私はsshで作業しているので、それは苦痛です。画面を使用することで、影響の一部を軽減しました。
端末が正常に動作し始めるように、ncurses でセグメンテーション違反の後に端末を更新するコマンドがあるかどうかを知りたいです。
指示、
stty sane
仕事をした。Enter が機能しない場合は、 を使用できます^J
。
stty sane ^J
CR/LF の解釈が壊れていることがあるので、^J
明示的に使用してください。
ncurses (任意の curses 実装) は、実行中に端末モードをrawおよびnoechoに設定し、アプリケーションがraw および noraw、echo および noecho関数を使用してこれらをシミュレートできるようにします。これは、これらのモードを切り替えるときの待機を避けるために、パフォーマンスのために行われます。
アプリケーションが を呼び出すとendwin
、ncurses は端末モードを復元します。はるかに頻繁に使用されますが、これはreset_shell_modeに対しても実行できます。endwin
アプリケーションがクラッシュするか、 を使用して端末モードを復元せずに終了する場合endwin
、最も明白な問題は、入力している内容が見えないことと、押しenterても機能しないことです。
SIGINT
ncurses は、ユーザーが開始したシグナル、をキャッチするためのシグナル ハンドラーを提供し、それらSIGTERM
がキャッチされるとクリーンアップします。キャッチしようとしないのは、その時点でアプリケーションが死んでいて、それを復活させて修復しようとするのは逆効果だからです。SIGSEGV
stty sane
を使用して端末モードを復元することを勧める人もいるかもしれません。それは「機能します」が、Unix プラットフォームでは、消去キーが予期しない値に設定されたままになる可能性があります。Linux および最新の BSD システムでは、たまたま期待どおりに動作します。
ただし、それを超えると、ncurses は正常にリセットされます
アプリケーションがこれらの機能のいずれかを使用する場合、reset
コマンドは適切な選択です。通常、画面もクリアされます (おそらく、望んでいたものではありません)。そしてそれはより少ない文字を使用します:
reset
controlJ
stty sane
controlJ
参考文献:
reset
- 再初期化SIGSEGV
を呼び出す などのシグナル ハンドラを記述しますendwin()
。