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