当 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 从属端的进程退出时退出?这是在哪里描述的?
在 Linux
read()
上,伪 tty 的主端的 a 将返回-1
并设置ERRNO
为EIO
当其从端的所有句柄都已关闭时,但会EAGAIN
在第一次打开从端之前阻塞或返回。当试图从没有主控的从站读取时,也会发生同样的事情。对于主端,条件是暂时的;重新打开从站将导致
read()
主站上的 a 再次工作。在 *BSD 和 Solaris 上,行为相似,不同之处在于
read()
将返回0
而不是-1
+EIO
。此外,在 OpenBSD 上, aread()
也将0
在第一次打开从属设备之前返回。我不知道这是否有任何标准规范或基本原理,但它允许(粗略地)检测另一端何时关闭,并简化程序的逻辑,比如
script
只是创建一个 pty 并在其中运行另一个程序。管理其他不相关程序可以连接的 pty 的主部分的程序中的解决方案是也打开并保持打开其从属端的句柄。
请参阅相关答案:当 pts 关闭时 read(2) 阻塞行为发生变化导致 read() 返回错误:-1 (EIO)
当一个进程退出时,它的所有文件描述符都会自动关闭。