制御文字と信号の関係は何ですか?それとも関連がないのでしょうか?
端末は制御文字を受け取りますか?
端末が制御文字を受信した後、端末が受信した制御文字に応答して取ることができるアクションの1つを処理するように信号を送信しますか?
例えば、
Linuxの端末では、Ctrl + Cは実行中のフォアグラウンドプロセスを終了します。 ASCIIでは、Ctrl + C「テキスト終了」を示す制御文字。
ASCIIでは、Ctrl + Dは転送終了を示す制御文字です。制御文字によって端末はプロセスに信号を送信しますか?
答え1
これターミナルドライバ(オペレーティングシステムの一部)間の関係を設定します。特殊文字そして信号。あなたの端末設定、たとえば、次のようにします。stty
は、入力した文字(存在する場合)で実行する操作を決定するために使用されます。必要に応じてこれらの特殊文字を再割り当てできますが、いくつかの注意事項があります。
- 各関数には特殊文字が1つしかありません。
- 1バイト文字のみを使用してください。
controlCそしてcontrolD伝統的な:一部のアプリケーションではこれらの値をハードコードできますが、ターミナルドライバではそうする必要はありません。
端末ドライバはソフトウェアであり、ユーザーの一部ではありません。端末。一部のキーボードでは、他のキーボードよりも特殊文字を異なる方法で割り当てる方が便利です(特殊文字のデフォルトの選択はオペレーティングシステムによって異なる場合があります)。
追加資料:
- 11.1.9 特殊文字(POSIX*ユニバーサル端末インターフェース)
- 11. 汎用端末インタフェース
- stty - 端末オプションの設定
答え2
制御文字と信号はある程度関連しています。stty -a
端末のコマンドで信号と文字の一致を確認できます。アクセス可能なRHELサーバーには、次のものが表示されます。
-bash-3.2$ stty -a
speed 38400 baud; rows 24; columns 135; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z;
rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -cdtrdsr
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel -iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
これらのいくつかはTTYおよび対応する入力機能に関連し、他のいくつかは信号に関連している。信号部分:
intr = ^C; quit = ^\; susp = ^Z;
これは、SIGINTがcontrol-C、SIGQUITがcontrol-backslash、SIGSTOPがcontrol-Zであることを意味します。必要に応じて一部または全部を再割り当てできます。望むよりman stty
。
あるいは、他の制御文字erase
はwerase
端末ドライバ自体で傍受されて使用されます。バックスペースの場合と同様に、ターミナルドライバは画面と入力ストリームから文字を削除します。ターミナルドライバの「モード」(生または調理、部分調理可能)も影響を与えます。テキストエディタは制御文字が大好きでよく使用され、vim
これらemacs
の制御文字を入力するとSIGINT、SIGQUIT、または他の何も受け取りません。プログラムはTTYを「rawモード」に設定し、ターミナルドライバの解釈なしでバイトのみを読み取ることができます。