据我所知,/dev/pts文件是为 ssh 或 telnet 会话创建的。
我试图弄清楚tty是如何工作的1(每个元素的工作流程和职责)。我已经阅读了几篇关于它的有趣文章,但仍然有一些模糊的地方。
这是我到目前为止的理解:
/dev/ptmx对伪终端的主控部分进行不同的系统调用。/dev/pts/[0-N],对应过时的串口,并在其上“附加”了一个slave伪终端。以下是我的问题:
pts商店还有什么其他信息?Xterm 是自己更新所有字段,还是在其上ptm添加一些“智能”?1. 我的理解基于Linus Akesson 揭秘的TTY和Andries Brouwer的Linux Kernel帖子,以及这些网站上的其他几个问题
如果我做:
echo foo > /dev/pts/12
Run Code Online (Sandbox Code Playgroud)
某些进程foo\n将从其文件描述符中读取到主端。
有没有办法找出那个(那些)过程是什么?
或者换句话说,我怎么能找出哪个 xterm/sshd/script/screen/tmux/expect/socat... 在 的另一端/dev/pts/12?
lsof /dev/ptmx将告诉我在任何 pty 的主端具有文件描述符的进程。一个进程本身可以使用ptsname()(TIOCGPTNioctl)根据自己的fd找出从设备到主端,所以我可以使用:
gdb --batch --pid "$the_pid" -ex "print ptsname($the_fd)"
Run Code Online (Sandbox Code Playgroud)
对于lsof构建该映射而返回的每个 pid/fd ,是否有更直接、可靠且侵入性更小的方法来获取该信息?
我想知道子进程的默认标准输入和标准输出是什么(如果有这样的默认值)。子进程的 stdin 和 stdout 是否与其父进程相同?这是从父母那里继承的东西还是父母设置的东西?还是子进程的标准输入和标准输出插入父进程的标准输入和标准输出?
在我的理解中,父母和孩子不是通过管道传输的,而是首先是克隆,所以我认为孩子的标准输入和标准输出与父母完全一样,但我不确定。
例如,在bash作为登录 shell运行的终端中,如果我键入sh它将创建一个子 shell 进程,它将作为 stdin 键盘和 stdout 终端屏幕,因此与其父进程相同。我想了解孩子的标准输入和标准输出是如何定义的以及它们是什么。
我想知道例如在这种情况下,如果孩子的标准输入和标准输出与父母的标准输入一样,这是因为父母的标准输入通过管道传输到孩子的标准输入中,而父母只是将其输入“重定向”给孩子,或者孩子是否得到了它的直接从键盘输入。
在同样的情况下,如果父级和子级具有相同的标准输入,这是否意味着父级处理输入给子级的相同命令?为什么我们只能在终端中看到孩子的标准输入/输出而不是它的父母?