一部のコマンドラインインタフェースツールは、キャンセル時に破損したコンソールを返しますCTRL+C
。時には、コマンドを実行する前にテキストが表示されないか、グラフィックの問題がある可能性がありますreset
。
(私はbashを使用しますが、シェルに依存しないことを望んでいます。)
この効果に名前がありますか?この問題の原因は何であり、プログラマはどのようにツールでこれらのことが発生しないのを防ぐことができますか?主なプログラミング言語には、この問題を解決するための戦略はありますか?
答え1
コンソールには時々reset(1)
(または一部stty(1)
コマンド)プロセス(シェルによって起動されたプログラムなど)が終了したときに擬似端末の状態が変わらないためです。
読むttyが公開されました。
(私はその取り扱いを見つけました擬似端末pseudottyはLinuxで最も難しい部分です)
主なプログラミング言語には、この問題を解決するための戦略はありますか?
端末を処理し、モードまたは回線規則を変更する正しく機能するプログラムは、競合を避け、適切な呼び出しを発行するように努力する必要があります(参照用語(3)) 端末を正しい状態に設定してください。しかし、図書館のような場所は呪いまたは読書船非常に役立ちます(ただし、クリーンアップルーチンを適切に呼び出す必要があります)。
バラより信号(7)そして信号セキュリティ(7)。コードの競合を避けるのは難しいです。読む未定義の動作。
不完全な回避策は、プログラムを実行するシェル関数を定義して実行することですreset
(時には不適切な場合があります)。
答え2
この問題を解決することは完全にシェルに依存しません。 zshには、ttyctl
ttyモードを「固定」または「固定解除」することができる組み込み機能があります。 Bashには似たようなことはないと思います。 tcshのコマンドはsetty
同じことを行いますが、より細かく設定することで個々の設定を固定できます。
ttyモードを凍結するとは、zshが現在のモードを記憶し、将来の子プロセスがそれを変更した場合、子プロセスが中断または終了したときにモードが復元されることを意味します。
これにより、クラッシュやターミナルをクリーンアップできないプログラムの悪影響からユーザーを保護できます。を使用して変更するには、解凍することをstty
覚えておく必要があります。それ以外の場合、シェルはstty
ユーザーが実行したすべての操作を即座にキャンセルします。
reset
回復stty
モードだけでなく、時には必要になるかもしれませんが、頻繁にはありません。