%3F.png)
答え1
バッシュした端末である標準入力 (stdin) から入力を取得します。
ターミナルは2つのうちのいずれかになりますモード:生または調理済み(「文字モード」および「行モード」とも呼ばれ、Unix の世界では主に「raw」および「cooked」という用語が使用されています) (「cooked」という単語は、「raw」の反対語を作る語呂合わせとして導入されました)。raw モードでは、端末は入力をすぐにアプリケーションに送信します。cooked モードでは、端末は行全体を読み取り、(非常に原始的な) 行編集メカニズムを提供し、ユーザーが を押したときにのみデータをアプリケーションに送信しますEnter。
ターミナルは、cooked モードで起動します。bash などの入力をより細かく制御する必要があるアプリケーションは、ユーザーがコマンドを入力するのを待っている間、ターミナルを raw モードに設定します。
答え2
端末はキーボードから受信したすべてのテキスト行をバッファリングすると思います。そのため、端末のデバイス ファイルにファイル記述子 (つまり fd0) がアタッチされているプログラムは、端末がテキストを「送信」するまで ( を押したときに発生します)、その行のテキストを見ることはできません Enter。
(シェルの行エディタがこれをどのように回避するかはわかりませんが、 を押す前にテキストを取得することは間違いありませんEnter)
また、シェルが子プロセス (この場合はping
) を起動すると、子プロセスの実行中は中断/ 実行状態になりますwait
。そのため、端末がテキストを保留していなくても、シェルは子プロセス用であると想定してそれを無視します。
画面に表示されるテキストは、ターミナル表示はしていますが、子プロセスが終了してシェルが「起動」するまで、それをキャプチャして何かを行うプログラムはありません。その後、テキストはシェルの行エディタに送信されます。ただし、すべての端末が必ずしもそうするとは限りません。