2

次のコードを見てみましょう。

int main(void)
{
             char c;

             while ((c = getchar()) != EOF)
                     putchar(c);

             return (0);
 }

このプログラムは、改行が文字として渡された後にのみ、文字をエコーバックします。readシステムコールを使用して直接読み取り、lenを1として渡してみましたが、新しい行が渡された場合にのみ読み取ります。ここに2つの質問があります:この最適化を実装したのは誰ですか、それはカーネルですか、それともターミナル/シェルですか?

第二に、誰が最初にキャラクターをエコーバックしているのか、それは最初のプレス自体です。ターミナル/シェルは、このプログラムの実行全体で何らかの役割を果たしますか?

4

2 に答える 2

4

シェルは関係ありません。入力したtty(rawモードではなく、エコーが有効になっていると仮定)は、入力時に文字を表示しますが、enterと入力するまで文字をプロセスに渡しません。すべてのバックスペースや編集などを処理し、プロセスがそれらを認識することはありません。Enterキーを押すと、ttyは入力された行をプロセスに渡します。

于 2013-01-14T20:22:54.043 に答える
1

タスク(プログラムなど)が実行されているときは、「実行中」の状態です。

プログラムがキーボード入力を要求すると、カーネルはプログラムを一時停止し、キーボード入力をプログラムメモリ内のバッファに配線します(IA32アーチのLDTおよびGDTレジスタによって維持されます)。

キーボードデータは、IVT(割り込みベクトルテーブル)の特定の割り込み機能で読み取られます(このテーブルは、IA32 ArchのIDTを使用して維持されます)

(キーボードのENTERキーを押して)新しい行が見つかると、入力バッファが閉じられ、タスクは「一時停止」状態から「準備完了」状態になります。

マルチタスクカーネルには、ユーザー入力を待って出力にエコーバックする「時間」はほとんどありません。代わりに、キーボードをバッファーに接続し、他の重要なタスク(タスクのスケジューリングなど)を実行します。プログラムが「実行中」の状態にあり、キーボードバッファがいっぱいになると、プログラムはバッファから入力を読み取り、出力バッファに書き込みます。

ただし、シェルはカーネルによってスケジュールされている単なるプログラムです。キーボードに直接アクセスすることはできませんが、カーネルによって割り当てられた特定のキーボードバッファにアクセスできます。

于 2013-01-14T20:23:15.777 に答える