在 C 或 bash 中,
我想知道,如果可能的话,您如何从 ssh 会话内部获取伪终端主机的文件描述符,该主机负责获取该会话的从属设备(pts)的输入。
shell进程没有主文件描述符,只有从属。
shell 的父进程(无论是 sshd 还是 xterm 或 screen 等等)通过调用getpt(3)
or来创建一个新的主进程posix_openpt(3)
。该函数返回主文件描述符。grantpt(3)
然后父进程通过调用、unlockpt(3)
和ptsname(3)
的组合来获取从文件描述符open(2)
。这适用于 Linux 和其他 POSIXized 系统,其他 *nixes 可能使用其他功能,但最终结果是相同的。父进程具有主/从文件描述符对。
然后,从属描述符和仅从属描述符作为其标准输入、输出和错误传递给 shell。
来自 Solaris 5.8 PTS(7D) 手册页 - STREAMS 伪 tty 从驱动程序
Only one open is allowed on a master device.
我想这回答了我的问题:)
编辑:实际上它没有,因为如果有办法获取文件描述符,我不需要再次打开,它是一个文件描述符,哈哈,不需要打开
在基于 unix 的系统上,您可以通过打开/dev/tty
. 在许多情况下,您的程序已经将其作为标准输入、标准输出和标准错误打开,但即使您的程序正在使用标准输入、标准输出或标准错误重定向来调用,/dev/tty
也会为您提供进程的控制终端。