为什么当另一端的进程终止时,阻塞 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()伪 tty 的主端上的 a 将返回-1并设置ERRNO为,但在从属端首次打开之前将阻塞或返回。EIOEAGAIN

当尝试从没有主设备的从设备读取数据时,也会发生同样的情况。对于Master端来说,该情况是瞬态的;重新打开从站将导致read()主站再次工作。

在 *BSD 和 Solaris 上,行为类似,区别在于将read()返回0而不是-1+ EIO。另外,在 OpenBSD 上,aread()也会0在从站首次打开之前返回。

我不知道是否有任何标准规范或理由,但它允许(粗略地)检测另一端何时关闭,并简化了程序的逻辑,例如script创建一个 pty 并在其中运行另一个程序。

在管理 pty 的主部分(其他不相关的程序可以连接到该部分)的程序中,解决方案是同时打开并保持打开其从端的句柄。

参见相关回答:当 pts 关闭时,read(2) 阻塞行为发生变化,导致 read() 返回错误:-1 (EIO)

为什么read()打开 pty 从属端的进程退出时退出?

当进程退出时,其所有文件描述符都会自动关闭。

相关内容