当 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
为,但在从属端首次打开之前将阻塞或返回。EIO
EAGAIN
当尝试从没有主设备的从设备读取数据时,也会发生同样的情况。对于Master端来说,该情况是瞬态的;重新打开从站将导致read()
主站再次工作。
在 *BSD 和 Solaris 上,行为类似,区别在于将read()
返回0
而不是-1
+ EIO
。另外,在 OpenBSD 上,aread()
也会0
在从站首次打开之前返回。
我不知道是否有任何标准规范或理由,但它允许(粗略地)检测另一端何时关闭,并简化了程序的逻辑,例如script
创建一个 pty 并在其中运行另一个程序。
在管理 pty 的主部分(其他不相关的程序可以连接到该部分)的程序中,解决方案是同时打开并保持打开其从端的句柄。
参见相关回答:当 pts 关闭时,read(2) 阻塞行为发生变化,导致 read() 返回错误:-1 (EIO)
为什么
read()
打开 pty 从属端的进程退出时退出?
当进程退出时,其所有文件描述符都会自动关闭。