web-dev-qa-db-ja.com

正規端末入力と非正規端末入力

私は試験のために勉強していますが、Unixでの正規の入出力と非正規の入出力の動作(cursesなど)について混乱しています。正規入力に「ラインディシプリン」が適用されるバッファがあることを理解しています。これは、バッファが非標準入力に対してバイパスされることを意味しますか、それとも単にライン制御が適用されないことを意味しますか?このプロセスは、入力操作と出力操作でどのように異なりますか?

私が使用したcursesプログラムでは、標準入力を示しています。ユーザーが入力した入力は、特定の数の文字が入力された後、または特定の時間が経過した後に自動的に入力されます。これらのいずれかが「ラインディシプリン」と見なされますか、それともまったく別のものですか。

39
titaniumdecoy

標準入力については、シェルを考えてください。実際、Bashや親戚にはコマンドライン編集機能があるため、古き良きBourne Shellを考えてください。入力行を入力します。間違えた場合は、消去文字を使用します(デフォルトは Backspace、通常;時々 Delete)前の文字を消去します。完全にめちゃくちゃになっている場合は、行削除文字で行全体をキャンセルできます(完全に標準化されていないことがよくあります Control-X)。一部のシステムでは、次のようにして単語を消去します Control-W。これはすべて標準入力です。行全体が集まり、行末文字まで編集されます— Return —が押された。その後、ライン全体が待機中のプログラムで使用できるようになります。未処理のread()システムコールに応じて、(read()への1回以上の呼び出しによって)行全体を読み取ることができます。

非正規入力の場合-viまたはvimなどを考えてください-文字を押すと、プログラムですぐに使用できます。リターンを押すまで、あなたは追いつかれません。システムは文字の編集を行いません。入力するとすぐにプログラムで使用できるようになります。物事を適切に解釈するのはプログラム次第です。現在、vimは、標準入力のように見える多くのことを実行します。たとえば、バックスペースは後方に移動し、入力モードではそこにあったものを消去します。しかし、それはvimがそのように動作させることを選択したためです。

正規および非正規の出力は、それほど深刻ではないビジネスです。ラインフィードの前にキャリッジリターンをエコーするかどうか、遅延を実行するかどうかなど、いくつかの違いがあります(電子機器では不要です。出力デバイスが110-ボーテレタイプ)。また、大文字と小文字を区別しない出力デバイス(テレタイプ)の処理なども実行できます。小文字は大文字で、大文字はバックスラッシュと大文字で出力されます。

以前は、ログインプロンプトにすべて大文字を入力すると、ログインプログラムは、実際の大文字の前にバックスラッシュを付けてすべての大文字を出力するモードに自動的に変換されていました。これはもはや電子端末では行われていないと思います。


コメントで、TitaniumDecoyは尋ねました:

では、非標準入力では、入力バッファーは完全にバイパスされますか?また、ラインディシプリンはどこから入りますか?

非標準入力でも、入力バッファーは使用されます。端末からの入力を待機しているread()呼び出しを使用するプログラムがない場合、文字は入力バッファーに保持されます。発生しないのは、入力バッファの編集です。

ライン専門分野は、入力編集が行う一連の操作のようなものです。したがって、行の規則の1つの側面は、削除文字が標準入力モードで前の文字を削除することです。 icase(入力ケースマッピング)を設定している場合、バックスラッシュが前に付いていない限り、大文字は小文字にマップされます。それはラインディシプリンだと思います、またはラインディシプリンの側面です。


EOF処理(Control-D)は標準モードで処理されます。実際には、「蓄積された入力をread()で利用できるようにする」ことを意味します。累積入力がない場合(入力した場合 Control-D 行の先頭))の場合、read()は0バイトを返します。これは、プログラムによってEOFとして解釈されます。もちろん、その後のキーボード、およびEOF(または非標準モードで実行)を無視するプログラム)は非常に満足します。

もちろん、標準モードでは、キーボードで入力された文字は通常画面にエコーされます。そのエコーが発生するかどうかを制御できます。ただし、これは正規の入力に対していくらか正接です。エコーがオフの場合でも、通常の編集が行われます。

同様に、割り込み信号と終了信号は、正規モード処理のアーティファクトです。また、次のようなジョブ制御信号も同様です Control-Z 現在のプロセスを一時停止してシェルに戻ります。同様に、フロー制御(Control-S、 Control-Q 出力を停止および開始する)は、標準モードで提供されます。

Rochkindの第4章 Advanced Unix Programming、2nd Edn はターミナルI/Oをカバーし、この情報の多くを提供します—さらに多くのことを提供します。他のUNIXプログラミングの本(少なくとも良い本)でもカバーされます。

81