ターミナルキーボード信号の私の現在の理解は(主に私が観察したものをGoogleで見つけることができるものにマッピングする努力に基づいています)。
- ユーザーがCCを押します。
- cの7ビットASCII値の左端の2ビットをクリアし、計算されたバイトで端末の入力バッファに送信されます。
その後、どの入力が端末(stty)で実行される信号を意味するかを構成するため、非常にあいまいになり始めます。これは、端末自体がプロセスに信号を送信していることを意味すると思います。しかし、端末がそれを読んでいるアプリケーションを認識していないと思います。
端末のキーボードを介して信号が一端から他端にどのように送信されますか?
答え1
C押されたときに押すと、キー押下Ctrlがターミナルエミュレータに送信され、次にkeyrelease X11イベントが送信されます。
このイベント(通常はキー押下イベント)が発生すると、ターミナルエミュレータは疑似^C
ttyデバイスのマスター側ファイル記述子に0x3バイト()を書き込みます。
isig
デバイスのtermios設定がオンになっていて、この設定が0x3バイトに設定されている場合、intr
カーネルはデバイスのすべてのメンバーにSIGINT信号を送信します。フォアグラウンドプロセスグループ端末デバイスの属性(ptyデバイスに保存されている別の属性)。この場合、0x3 バイトは pty のスレーブ側から読み出されません。
通常、対話型シェルはシェル操作用のsetpgid()
プロセスグループを作成し(使用)、どのプロセスグループを前景にインポートするかを決定します(tcsetpgrp()
ptyデバイスのこのプロパティを使用)。
たとえば、対話型シェルのプロンプトで実行する場合:
foo | bar
シェルは、2つのプロセスを含む新しいプロセスグループを起動し(その中で実行し、標準入力/出力をパイプした後foo
)bar
、グループを前面にインポートします。 Ctrl-Cを押すと、両方のプロセスがSIGINTを受け取ります。
存在する:
foo | bar &
同じですが、プロセスグループは前景にインポートされません(そしてシェルはそれを待たないので、他のコマンドを入力することができます)。これらのプロセスはCtrl-Cを介してSIGINTを取得できませんが、ttyデバイスから読み取ろうとすると中断される可能性があります。