どのプロセスがこれらのマッピングを担当しているかを理解するためにソースコードを読みましたが、まだわかりません。誰でもこれに関連するコードを教えてもらえますか?
ソースコード: agetty+login(util-linux プロジェクト)、 システム
答え1
このマッピングを担当するプロセスはありません。これはカーネルの一部であるデバイスドライバ機能であり、ctrl-cデフォルトは .
ctrl-ctty(またはpty)デバイスにマッピングされ、SIGINT
端末を制御するフォアグラウンドプロセスに送信されます。
Systemdはagettyをttyデバイスに接続して起動し、agettyはttyデバイスを初期化し(styまたはtcsetattrのシステムコールバージョンを使用して)入力を待ってから、最終的にログインを実行します。
たとえば、tcsetattrを使用している場合は、c_cc
ttyがアクション(行の編集やシグナルなどを含む)にマッピングする特殊文字配列とデフォルト値をVINTR
含むttyにtermios構造を適用します。ctrl-ctty がこれらの文字を解釈できるようにします。
しばらくすると、アプリケーション(bash、vim、emacsなど)もtermiosを操作し、モードビットを変更して行編集文字を無効にしたり(エミュレート)、文字通り読み込んで使用できるように一部または全部の中断文字を無効にすることができます。 。アプリケーションのニーズに応じて。
答え2
デフォルトのシグナルマッピングは、以前のプロセス(init、agetty、login、またはbash)ではなく、Linuxカーネルによって処理されるようです。
ただし、関連ライブラリを介して設定/インポートできますtermios
。
私の仮説を検証するために、単純なテストプログラム(test.c)を作成し、それをカーネルが呼び出す最初のプロセスにしました(initのように)。コードは以下のように表示されます。
/* test.c */
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
int main(int argc, char **argv)
{
struct termios ts;
tcgetattr(STDIN_FILENO, &ts);
printf("INTR: %u\nSUSP: %u\n", ts.c_cc[VINTR], ts.c_cc[VSUSP]);
return 0;
}
その後、プロンプトに従ってinit
システムを再起動すると、プログラムが表示されます。
INTR: 3
SUSP: 26
これら2つの値はそれぞれ^C
に対応します^Z
。これはカーネルが基本的にこれを行うことを意味します。