端末で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コードは特殊文字よりも大きいですX
。0x40
たとえば、文字0x08
(BS
)はでエコーされます^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>[41m
ANSIカラーエスケープ(何も表示しない[41m
)として解釈し、背景を赤に置き換えます。
ターミナルエミュレータとその設定に応じて、emacsユーザーは^N
反射的に押して代替文字セットに切り替え、すべての文字を線画波線に置き換えることができます。
通常、これは起こりたくないので、これはECHOCTL
合理的なデフォルトと見なすことができます。
[1] この説明はそれほど正確ではありません。
カラットでエコーされる「ターミナル特殊文字」ではありません。制御文字(ASCII
0x0 - 0x1f
と0x7f
)、特殊かどうか。Q
「端末特殊文字」を定義する場合VINTR
(デフォルト文字を^C
に置き換える)、まだまたは代わりに、stty intr Q
でエコーされます。Q
^Q
chr(0x91)
Linuxでこのフラグを設定すると、エコー(または他の形式)
VEOF
はありません。しかしそれは^D
ICANON
〜するこの場合、* BSDおよびMacOSでもエコーされます。ASCII
0x7f
(DEL
)はchar + 0x40
(説明どおり)とは表示されず、char ^ 0x40
(^?
)で表されます。他の人と同様にbtw ;-)
答え3
Unixスタイルのターミナル接続はもともとはるかに遅い(9600bps以下)接続用に開発されており、おそらくダイヤルアップモデム回線を介して転送エラーが発生する可能性があります。エコー機能は、アプリケーションが入力を受け取る前にTTYドライバによって生成されますが、アプリケーションは必要に応じてエコー機能を無効にすることができます。
負荷の高いサーバーおよび/または遅い接続を介して接続するときにすべての文字をエコーすると、文字が正しく受信されたというフィードバックが得られます。したがって、これを見ると、^C
リモートコンピュータがCtrl+キーを押すことを正しく受信したことがわかります。C今回の追加の回答がない場合は、問題はコミュニケーションではないことに気付くでしょう。
たとえば、システムが忙しくて新しいコマンドプロンプトをすぐに表示できない場合、中断されたプログラムまたはスクリプトに終了する前にいくつかの操作(保存されていないデータのバックアップなど)を実行する、または中断信号を無視するSIGINTハンドラがあります。できます。完全に。