端末に時々^ Cのような特殊文字が表示されるのはなぜですか?

端末に時々^ Cのような特殊文字が表示されるのはなぜですか?

端末でGUIプログラムを実行してCtrl+を入力すると、C端末にエコーが表示されます。

^C

信号はアプリケーション(および端末で処理されるキー)に渡されます。キャラクターにエコーがあるのはなぜですか?

答え1

実行すると端末設定に過ぎず、デフォルトで入力した内容はすべてエコーされます。

stty -ctlecho

これで、端末はこれらの文字を表示しないように設定されました。

man stty | less +/ctlecho

[-]ctlecho は
帽子記号の制御文字 ('^c') をエコーし​​ます。

この構成を永久に作成するには、* rcファイルに追加してください。 (~/.bashrcまたは類似)。

stty設定を一覧表示するには、コマンドを個別に入力します。

答え2

この文字はECHO端末設定でフラグを立てたため、エコーされ、エコーされます。^C形式あなたのせいで返品ECHOCTL旗を歩いてください。ほとんどのシステムでは、両方のフラグがデフォルトでオンになっています。小文字のユーティリティを使用してオンまたはオフにすることができますstty(1)

stty -echoctl # turn echoctl off
stty echoctl  # turn echoctl on

termios(3)手順については、Linuxのマンページを参照してください[1]:

ECHOCTL(POSIXにはありません)

ECHOこれも設定されていればTAB, NL, をSTART除く端末特殊文字STOPは でエコーされます^X。ここでASCIIコードは特殊文字よりも大きいですX0x40たとえば、文字0x08BS)はでエコーされます^H。 [必要_BSD_SOURCEまたは_SVID_SOURCE]

回転に注意してくださいただECHOCTLフラグを下げるいいえ制御文字がエコーされるのを防ぎますが、^Xキャレット形式ではなく元の形式にエコーします。文字が特殊で信号(例:^C-> VINTR-> SIGINT)を生成するという事実は、エコーかどうかには何の影響もありません。

ほとんどの端末エミュレータは何らかの方法で制御文字を表示しませんが(残念ながら)これを興味深い方法として解釈できます。たとえば、または sleep 3600などのコマンドを実行し、次の行cat > /dev/nullでキーを押します<Escape>[41m foo<Enter>。一度オンにすると画面に印刷されechoctl、特別なことは発生しません。^[[41m fooただし、echoctlオフにすると、端末はエコーを<Raw_esc>[41mANSIカラーエスケープ(何も表示しない[41m)として解釈し、背景を赤に置き換えます。

ターミナルエミュレータとその設定に応じて、emacsユーザーは^N反射的に押して代替文字セットに切り替え、すべての文字を線画波線に置き換えることができます。

通常、これは起こりたくないので、これはECHOCTL合理的なデフォルトと見なすことができます。


[1] この説明はそれほど正確ではありません。

  • カラットでエコーされる「ターミナル特殊文字」ではありません。制御文字(ASCII0x0 - 0x1f0x7f)、特殊かどうか。Q「端末特殊文字」を定義する場合VINTR(デフォルト文字を^Cに置き換える)、まだまたは代わりに、stty intr Qでエコーされます。Q^Qchr(0x91)

  • Linuxでこのフラグを設定すると、エコー(または他の形式)VEOFはありません。しかしそれは^DICANON〜するこの場合、* BSDおよびMacOSでもエコーされます。

  • ASCII 0x7fDEL)はchar + 0x40(説明どおり)とは表示されず、char ^ 0x40^?)で表されます。他の人と同様にbtw ;-)

答え3

Unixスタイルのターミナル接続はもともとはるかに遅い(9600bps以下)接続用に開発されており、おそらくダイヤルアップモデム回線を介して転送エラーが発生する可能性があります。エコー機能は、アプリケーションが入力を受け取る前にTTYドライバによって生成されますが、アプリケーションは必要に応じてエコー機能を無効にすることができます。

負荷の高いサーバーおよび/または遅い接続を介して接続するときにすべての文字をエコーすると、文字が正しく受信されたというフィードバックが得られます。したがって、これを見ると、^CリモートコンピュータがCtrl+キーを押すことを正しく受信したことがわかります。C今回の追加の回答がない場合は、問題はコミュニケーションではないことに気付くでしょう。

たとえば、システムが忙しくて新しいコマンドプロンプトをすぐに表示できない場合、中断されたプログラムまたはスクリプトに終了する前にいくつかの操作(保存されていないデータのバックアップなど)を実行する、または中断信号を無視するSIGINTハンドラがあります。できます。完全に。

関連情報