web-dev-qa-db-ja.com

相手側のプロセスが停止したときに、ptyでread()をブロックすると戻るのはなぜですか?

Ptyのスレーブ側が開かれていない場合、read(master_fd, &byte, 1);を実行するプロセスのstraceは、次のことを示します。

_read(3, 
_

したがって、ptyのスレーブ側に誰も接続されていない場合、read()はデータを待機します-エラーで返されません。

しかし、ptyのスレーブ側がプロセスによって開かれ、そのプロセスが終了すると、read()は次のように停止します。

_read(3, 0xbf8ba7f3, 1)                  = -1 EIO (Input/output error)
_

Ptyはで作成されます

_master_fd = posix_openpt(O_RDWR|O_NOCTTY)
_

Ptyのスレーブ側はで開かれます

_comfd = open(COM_PORT, O_RDWR|O_NOCTTY)
_

Ptyのスレーブ側を開いたプロセスが終了すると、なぜread()が終了するのですか?これはどこに記述されていますか?

2
Igor Liferenko

Linuxでは、疑似ttyのマスター側のread()は_-1_を返し、すべてのハンドルがスレーブ側にある場合はERRNOEIOに設定します。は閉じられていますが、スレーブが最初に開かれる前にEAGAINをブロックまたは返します。

マスターのないスレーブから読み取ろうとした場合も同じことが起こります。マスター側の場合、状態は一時的です。スレーブを再度開くと、マスター側のread()が再び機能します。

* BSDでも動作は似ていますが、read()が_0_ + EIOではなく_-1_を返す点が異なります。

これに標準的な仕様や理論的根拠があるかどうかはわかりませんが、反対側が閉じられたことを(大まかに)検出でき、scriptのようなプログラムのロジックを簡素化します。その中で別のプログラムを実行します。

他の無関係なプログラムが接続できるptyのマスター部分を管理するプログラムの解決策は、スレーブ側へのハンドルも開いて開いたままにすることです。

関連する回答を参照してください: read(2)ptsが閉じられるとブロック動作が変化し、read()がエラーを返す:-1(EIO)

Ptyのスレーブ側を開いたプロセスが終了すると、なぜread()が終了するのですか?

プロセスが終了すると、そのすべてのファイル記述子が自動的に閉じられます。

3
mosvy