反対側のプロセスが終了したときにブロックptyのread()が返されるのはなぜですか?

反対側のプロセスが終了したときにブロックptyのread()が返されるのはなぜですか?

ptyのスレーブ側が開いていない場合は、strace開いているプロセスでread(master_fd, &byte, 1);次のように表示されます。

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)

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

ベストアンサー1

Linuxでは、read()pseudo-ttyのマスター側のaは、スレーブ側のすべてのハンドルが閉じられたときに返され、設定されますが、-1スレーブERRNO側が最初に開くまでブロックまたは返されます。EIOEAGAIN

マスターのないスレーブデバイスからデータを読み取ろうとすると、同じ状況が発生します。マスター側の場合、この状況は一時的です。スレーブを再度開くと、read()マスターは再び動作します。

* BSDとSolarisでは、+が代わりにread()返されることを除いて、動作は似ています。また、OpenBSDでは、スレーブが最初に開く前にaも返されます。0-1EIOread()0

標準仕様や理由があるかどうかはわかりませんが、反対側の端が閉じる時期を(おおよそ)検出できるようにし、scriptptyを作成してその中で他のプログラムを実行するなど、プログラムのロジックを単純化します。

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

関連する回答を見る:ptsが閉じると、read(2)のブロック動作が変更され、read()はエラー:-1(EIO)を返します。

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

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

おすすめ記事