相关疑难解决方法(0)

91
推荐指数
3
解决办法
11万
查看次数

每个伪终端 (PTY) 组件(软件、主端、从端)的职责是什么?

我试图弄清楚tty如何工作的1(每个元素的工作流程和职责)。我已经阅读了几篇关于它的有趣文章,但仍然有一些模糊的地方。

这是我到目前为止的理解:

  • 仿真终端/dev/ptmx对伪终端的主控部分进行不同的系统调用。
  • 伪终端的master部分分配了一个文件/dev/pts/[0-N],对应过时的串口,并在其上“附加”了一个slave伪终端。
  • 从伪终端保存会话ID、前台作业、屏幕大小等信息。

以下是我的问题:

  1. ptmx除了分配从属部分之外还有什么用途吗?它是否提供某种“智能”,或者模拟终端(例如 xterm)具有像终端一样运行的所有智能?
  2. 为什么 xterm必须与 master 部分交互,因为它只转发 slave 部分的 stdout 和 stdin?为什么不能 直接读写pts文件
  3. 会话 ID 是否总是附加到一个 pts 文件,反之亦然?我可以输入 ps 命令并找到2 个 sessionId 的相同 /dev/pts/X吗?
  4. pts商店还有什么其他信息?Xterm 是自己更新所有字段,还是在其上ptm添加一些“智能”?

1. 我的理解基于Linus Akesson 揭秘TTYAndries BrouwerLinux Kernel帖子,以及这些网站上的其他几个问题

kernel terminal-emulator terminal tty pty

77
推荐指数
3
解决办法
2万
查看次数

我们如何知道谁在伪终端设备的另一端?

如果我做:

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 ,是否有更直接、可靠且侵入性更小的方法来获取该信息?

terminal-emulator open-files pty

29
推荐指数
2
解决办法
6391
查看次数

子进程的默认标准输入和标准输出是什么?

我想知道子进程的默认标准输入和标准输出是什么(如果有这样的默认值)。子进程的 stdin 和 stdout 是否与其父进程相同?这是从父母那里继承的东西还是父母设置的东西?还是子进程的标准输入和标准输出插入父进程的标准输入和标准输出?

在我的理解中,父母和孩子不是通过管道传输的,而是首先是克隆,所以我认为孩子的标准输入和标准输出与父母完全一样,但我不确定。

例如,在bash作为登录 shell运行的终端中,如果我键入sh它将创建一个子 shell 进程,它将作为 stdin 键盘和 stdout 终端屏幕,因此与其父进程相同。我想了解孩子的标准输入和标准输出是如何定义的以及它们是什么。

我想知道例如在这种情况下,如果孩子的标准输入和标准输出与父母的标准输入一样,这是因为父母的标准输入通过管道传输到孩子的标准输入中,而父母只是将其输入“重定向”给孩子,或者孩子是否得到了它的直接从键盘输入。

在同样的情况下,如果父级和子级具有相同的标准输入,这是否意味着父级处理输入给子级的相同命令?为什么我们只能在终端中看到孩子的标准输入/输出而不是它的父母?

process stdout stdin

9
推荐指数
1
解决办法
1万
查看次数

标签 统计

pty ×3

terminal ×2

terminal-emulator ×2

devices ×1

kernel ×1

linux ×1

open-files ×1

process ×1

stdin ×1

stdout ×1

tty ×1