具体的には、擬似端末用語で話しましょう。疑似端末ペアのファイル記述子master
とslave
があるとします(これが制御ttyであると仮定します)。 IXON
(または同じように機能するmaster
)でslave
を無効にすると、write(master, &control_s_code, 1)
を実行すると、read(slave, &byte, 1)
が取得されます。このコード。同じ懸念control_q_code
。問題は、IXOFF
を無効にするとどうなるかということです。
IXOFF
は疑似ttyには実装されておらず、疑似ttyにIXOFF
を設定しても何の効果もありません。
IXOFF
により、ttyドライバーは入力キューがいっぱいになるとVSTOP
文字を反対側に送信し(これにより、それ以上のデータを送信できなくなります)、VSTART
それが処理され、より多くのデータのための場所があるときの文字。
これはIXON
とは異なります。これにより、ttyドライバーは反対側から送信されたVSTART
/VSTOP
文字を尊重し、VSTOP
を受信します。 (_^S
_)文字、VSTART
(_^Q
_)文字が受信されるまで送信を停止します。
疑似ttyの場合、「反対側」はマスターptyです。ターミナルエミュレータ。 _^S
_を押すと、それは_IXON
_であり、IXOFF
設定ではなく、スレーブttyが入力された文字のエコーバックとそれに書き込まれたデータの表示を停止します(スレーブttyへのwrite(2)
がブロックまたはEAGAIN
を返す場合、出力キューがいっぱいになるまでキューに入れられます。
カーネルはスレーブの入力キューがいっぱいになっているかどうかを常に(構造体フィールドなどをチェックすることによって)認識し、マスターptyへのプロセス書き込みをブロックできるため、疑似ttyにフロー制御を実装する必要はありません。
ソフトウェアフロー制御は、実際のシリアル接続を使用する場合にのみ役立ちますなし RTS/CTSのような帯域外信号:他のUnixとは異なり、TCPまたは他の "パイプ「抽象化、ワイヤはバッファリングされておらず、受信機がすべての状態変化を読み取るまで、ワイヤがいっぱいになってブロックされることはありません。