从机端使用后(open()
、read()
、write()
、close()
),主机端read()
完成并返回 EIO 错误。但我期望能够open()
/close()
多次从端而不中断主 fd。
从机之后是否可以保持两端有效close()
?当从端关闭时,如何保持我的“主”程序运行?我应该重新运行整个grantpt(); unlockpt(); ptsname();
序列吗?
答案1
短:无
Long:伪终端从属连接是一个终端的一端联系,像一根管子。两者都是通过内核在用户进程之间来回传递数据的方式。
一旦一端关闭,您就会失去连接。ptsname
POSIX 中的描述是这样的:
失败时,
ptsname()
应返回空指针。如果 fildes 是一个,则可能会发生这种情况无效的文件描述符或者如果文件系统中不存在从设备名称。
一旦关闭文件描述符,它就无效了。
如果您想重用连接,您可以采取一些解决方法,例如将打开的从属文件描述符传递到新创建的进程,例如,从您编写的用于管理从属文件描述符的服务器应用程序。
进一步阅读:
- 7.2 伪终端(文本终端操作指南)
close
- 关闭文件描述符(POSIX)grantpt
- 授予对从属伪终端设备的访问权限(POSIX)pipe
- 创建进程间通道(POSIX)ptsname
- 获取从属伪终端设备的名称(POSIX)unlockpt
- 解锁伪终端主/从对(POSIX)
上面是2016年写的。2022年的评论提到TIOCGPPEER,这是一个ioctl
允许应用程序获取新的文件描述符:
(自 Linux 4.13 起)在 fd 中给定一个引用伪终端主设备的文件描述符,打开(使用给定的 open(2) 样式标志)并返回一个引用对等伪终端从设备的新文件描述符。无论从设备的路径名是否可通过调用进程的挂载命名空间访问,都可以执行此操作。
(关闭的文件描述符仍然无效)。
答案2
根据对其他答案的评论:是的,实际上。
当您创建 pty 对时,让主端进程打开从属端,并保持其打开状态。这样,无论有多少客户端打开和关闭从属设备,其引用计数都永远不会为零,并且永远不会变得无效。