阅读了各种资源,包括http://www.linusakesson.net/programming/tty/我对伪终端的结构和使用仍然很困惑和好奇
在 Linux 终端(bash 不是 tty)中,我们有三个流:
每个文件都有一个文件描述符。
这些文件描述符映射到流 FILE*。
例如,我们可以使用 fileno() 和 fdopen() 在它们之间进行切换。
我可以用 pty 做什么?
我通常认为 stdout、stdin 和 stderr 与进程相关联。
我认为说有一个与 pty 关联的 stdout、stdin 和 stderr 是不正确的。
因此,给定一个 pty(对于像 bash 这样的进程而不是它的 pid),您如何获取它们并将它们连接到 bash 意义上的终端?
单个文件描述符(对于 pty)如何映射到三个流? (显然不是)
它能以某种方式映射到一个进程吗?
当使用 openpty() 时,我想连接流程在主终端和从终端上,您需要为 stdin、stdout 和 stderr 设置单独的管道,并使用选择循环连接它们并在它们之间传输数据。
但是您是否可以假设 stdin 和 stdout 已连接(通过 tty)并仅设置一个 stderr 管道以避免 stdout 和 stderr 被合并?
如果我们有一个主进程和从进程,“额外”tty 实际上为我们做什么?
以下是我认为我知道并且相关的一些事情:
The 打开pty()函数返回一对文件描述符,代表伪终端的主端和从端。
每个文件描述符都指向字符设备 - 请参阅https://man7.org/linux/man-pages/man7/pty.7.html
现在 Unix 中的设备只是特殊文件,因此文件描述符是有意义的。
bash 终端有三个流,但 tty 只是一个通道(stdout 和 stderr 之间没有区别)。
虚拟终端(tty)也有一些“魔力”(例如线路规则)。
如果我要问 pty 的 FD 映射到什么文件,它将是设备文件 /dev/ptyX 或其他文件。
由 openpty() 创建的主/从通道的两端都有一个“终端”。
它实际传输什么数据?
我通常将文件描述符视为表示文件的内核结构表的索引。
显然,其中一些文件是流(FILE* 的内核版本),其中一些
很特别。
与终端 (tty) 关联的主要用户空间结构是使用 tcgetattr 从 FD 获得的 termios。
这允许您设置终端参数,但它不会识别任何流或进程
或行纪律。
对于您认为是文件的 FILE* 或 fd,有一组非常清晰且常用的 API 定义了您可以执行的操作。
我模糊地知道我可以用字符设备做什么(例如https://unix.stackexchange.com/questions/37829/how-do-character-device-or-character-special-files-work).
但是你能用 pty 做什么呢?
给定一个流,我们可以使用 isatty() 确定它是否有关联的 tty,并使用 ttyname() 识别该 tty。
所以在内部某个地方有一些东西是知道的
tty 和流是关联的。
isatty(STDERR_FILENO) 也是 true,所以它不仅仅是 stdin 和 stdout。
最初引起我兴趣的是一个程序,它应该是一个守护进程,但却创建了一个 ncurses UI。我一直在考虑如何让进程打开其 ncurses 按需 UI(在 pty 中)。屏幕程序可以让你做到这一点,但它在幕后做了什么。
描述此用例的问题是 -将终端附加到作为守护进程运行的进程(以运行 ncurses UI)
看待这个问题的另一种方式是从面向对象的角度来看。
有哪些函数以“pty”作为参数。它们有什么用?
如果我有一个 pty 对象。它会有哪些方法呢?
如果仅列出这些函数,则手册页中会缺少一些关键信息。前置条件、后置条件和不变量是什么。