web-dev-qa-db-ja.com

IXON属性とIXOFFtty属性の違いは何ですか?

具体的には、擬似端末用語で話しましょう。疑似端末ペアのファイル記述子masterslaveがあるとします(これが制御ttyであると仮定します)。 IXON(または同じように機能するmaster)でslaveを無効にすると、write(master, &control_s_code, 1)を実行すると、read(slave, &byte, 1)が取得されます。このコード。同じ懸念control_q_code。問題は、IXOFFを無効にするとどうなるかということです。

2
Igor Liferenko

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または他の "パイプ「抽象化、ワイヤはバッファリングされておらず、受信機がすべての状態変化を読み取​​るまで、ワイヤがいっぱいになってブロックされることはありません。

4
mosvy