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
側が最初に開くまでブロックまたは返されます。EIO
EAGAIN
マスターのないスレーブデバイスからデータを読み取ろうとすると、同じ状況が発生します。マスター側の場合、この状況は一時的です。スレーブを再度開くと、read()
マスターは再び動作します。
* BSDとSolarisでは、+が代わりにread()
返されることを除いて、動作は似ています。また、OpenBSDでは、スレーブが最初に開く前にaも返されます。0
-1
EIO
read()
0
標準仕様や理由があるかどうかはわかりませんが、反対側の端が閉じる時期を(おおよそ)検出できるようにし、script
ptyを作成してその中で他のプログラムを実行するなど、プログラムのロジックを単純化します。
(関連していない他のプログラムが接続できる)ptyのマスター部分を管理するプログラムでは、解決策はスレーブへのハンドルを同時に開いて開いたままにすることです。
関連する回答を見る:ptsが閉じると、read(2)のブロック動作が変更され、read()はエラー:-1(EIO)を返します。
read()
ptyスレーブを開いたプロセスが終了すると、なぜ終了するのですか?
プロセスが終了すると、すべてのファイル記述子が自動的に閉じます。