bash はどのようにしてターミナルに書き込まれた内容を取得するのでしょうか (Enter キーが押されずに)?

bash はどのようにしてターミナルに書き込まれた内容を取得するのでしょうか (Enter キーが押されずに)?

コマンドが実行中であるとしますping。コマンドがまだ実行されている間にターミナルに何かを入力しますping

これでping、終了してbash制御を取り戻すと、実行bash中に入力した内容がターミナルに印刷されますping。これは、私が言いたいことを示すスクリーンショットです。

ここに画像の説明を入力してください

この情報はどのようにbash取得されましたか? から取得したのではないことは確かですstdin。 と入力したときに"I typed this while ping was running"を押さなかったEnter(したがって はstdin空です) からです。

答え1

バッシュした端末である標準入力 (stdin) から入力を取得します。

ターミナルは2つのうちのいずれかになりますモード:または調理済み(「文字モード」および「行モード」とも呼ばれ、Unix の世界では主に「raw」および「cooked」という用語が使用されています) (「cooked」という単語は、「raw」の反対語を作る語呂合わせとして導入されました)。raw モードでは、端末は入力をすぐにアプリケーションに送信します。cooked モードでは、端末は行全体を読み取り、(非常に原始的な) 行編集メカニズムを提供し、ユーザーが を押したときにのみデータをアプリケーションに送信しますEnter

ターミナルは、cooked モードで起動します。bash などの入力をより細かく制御する必要があるアプリケーションは、ユーザーがコマンドを入力するのを待っている間、ターミナルを raw モードに設定します。

答え2

端末はキーボードから受信したすべてのテキスト行をバッファリングすると思います。そのため、端末のデバイス ファイルにファイル記述子 (つまり fd0) がアタッチされているプログラムは、端末がテキストを「送信」するまで ( を押したときに発生します)、その行のテキストを見ることはできません Enter
(シェルの行エディタがこれをどのように回避するかはわかりませんが、 を押す前にテキストを取得することは間違いありませんEnter)

また、シェルが子プロセス (この場合はping) を起動すると、子プロセスの実行中は中断/ 実行状態になりますwait。そのため、端末がテキストを保留していなくても、シェルは子プロセス用であると想定してそれを無視します。

画面に表示されるテキストは、ターミナル表示はしていますが、子プロセスが終了してシェルが「起動」するまで、それをキャプチャして何かを行うプログラムはありません。その後、テキストはシェルの行エディタに送信されます。ただし、すべての端末が必ずしもそうするとは限りません。

関連情報