標準入力の場合 — シェルを考えてください。実際には、古き良き Bourne シェルを考えてみてください。Bash とその親戚にはコマンドライン編集機能があるからです。入力行を入力します。間違えた場合は、消去文字 (デフォルトはBackspace通常、場合によってはDelete) を使用して前の文字を消去します。完全に失敗した場合は、ラインキル文字でライン全体をキャンセルできます (完全に標準化されていないことがよくありControl-Xます)。一部のシステムでは、「erase」という単語が表示されControl-Wます。これはすべて標準的な入力です。行末文字 — Return— が押されるまで、行全体が収集および編集されます。その後、待機中のプログラムが回線全体を利用できるようになります。read()
未処理のシステム コールに応じて、行全体を読み取ることができます (1 つまたは複数のread()
)。
非標準的な入力 (考えるvi
かどうかvim
など) の場合、文字を押すと、プログラムですぐに使用できるようになります。リターンを押すまで、あなたは拘束されません。システムは文字を編集しません。これらは、入力されるとすぐにプログラムで使用できるようになります。物事を適切に解釈するのはプログラム次第です。さて、vim
標準的な入力に少し似ている多くのことを行います。たとえば、バックスペースは後方に移動し、入力モードではそこにあったものを消去します。しかし、それvim
は、そのように動作させることを選択したためです。
正規および非正規の出力は、それほど深刻なビジネスではありません。改行の前にキャリッジ リターンをエコーするかどうか、および遅延を行うかどうか (電子機器では不要。出力デバイスが 110-ボーテレタイプ)。また、大文字と小文字を区別しない出力デバイス (テレタイプ) の処理なども実行できます。小文字は大文字、大文字はバックスラッシュと大文字で出力されます。
以前は、ログイン プロンプトにすべて大文字を入力すると、ログイン プログラムは自動的にすべての大文字が実際の大文字の前にバックスラッシュを付けて出力されるモードに変換されていました。これはもはや電子端末では行われていないのではないかと思います。
コメントで、TitaniumDecoy は次のように尋ねました。
非標準入力では、入力バッファは完全にバイパスされますか? また、ラインの規律はどこに入るのですか?
非正規入力の場合、入力バッファーは引き続き使用されます。端末からの入力を待っている呼び出しを持つプログラムがない場合read()
、文字は入力バッファーに保持されます。入力バッファの編集は行われません。
ライン分野は、入力編集が行う一連の操作のようなものです。したがって、行規律の 1 つの側面は、消去文字が標準入力モードで前の文字を消去することです。(input case-mapping) が設定されている場合icase
、バックスラッシュが前にない限り、大文字は小文字にマップされます。それは線の規律、または線の規律の側面だと私は信じています。
EOF 処理 ( Control-D) は正規モードで処理されることを忘れていました。実際には、「蓄積された入力を利用できるようにする」ことを意味しますread()
。蓄積された入力がない場合 (Control-D行の先頭に入力した場合)、 はread()
0 バイトを返し、プログラムによって EOF として解釈されます。もちろん、その後キーボードでさらに多くの文字を楽しく入力でき、EOF を無視する (または非標準モードで実行する) プログラムは非常に満足します。
もちろん、カノニカル モードでは、キーボードで入力された文字は通常画面にエコーされます。そのエコーが発生するかどうかを制御できます。ただし、これは正規の入力とは多少関係があります。エコーがオフの場合でも、通常の編集が行われます。
同様に、割り込みシグナルと終了シグナルは、標準モード処理の成果物です。Control-Z現在のプロセスを一時停止してシェルに戻るなどのジョブ制御信号も同様です。同様に、フロー制御 ( Control-S、Control-Q出力の停止と開始) は正規モードによって提供されます。
Rochkind のAdvanced Unix Programming, 2nd Ednの第 4 章では、端末 I/O について説明し、この情報の多くを提供しています。他の UNIX プログラミングの本 (少なくとも優れた本) では、これについても取り上げます。