【问题标题】:difference between pty and a pipepty 和 pipe 的区别
【发布时间】:2014-12-26 21:12:22
【问题描述】:

我一直在阅读此页面示例中有关 ptys 的信息:http://www.rkoucha.fr/tech_corner/pty_pdip.html。我有两个问题:

  • 使用 pty 和使用管道有什么区别,或者说最重要的区别是什么?根据我的阅读,两者都用于进程间通信,但是使用 pty 进程可以“将其视为普通终端”。这是什么意思?

  • 什么是“控制终端”?我读过它们,但无法理解它们的真正含义。控制终端是否总是分配给进程的 pty?

【问题讨论】:

  • 我的问题是不是很糟糕?我没有看到答案,想知道我是否问错了什么
  • 不,你的问题很好(我记得我自己也想知道)。但是,它非常广泛,并且很难非技术性地回答,而您提到的文章已经非常好。我会尝试在下面给出答案
  • 对于 PTY,另请参阅 en.wikipedia.org/wiki/Pseudo_terminal

标签: terminal pipe pty


【解决方案1】:

你提到的article 非常好,很难改进,但它是相当技术性的。我将尝试给出一个技术性较低的解释(请耐心等待,Unix 大师!)

管道只是一个单向数据通道:它只能在一端写入,而在另一端读取。对于双向进程间通信,您总是需要 两个 管道。管道非常适合移动钻头,但仅此而已。

一个pty(伪终端)可以在两端进行读写,但它不仅仅是一个双向数据通道。要理解这一点,看看一个真实的终端是很有用的:在一端,有一个读取击键并将字符发送到电传打字机或屏幕的过程。另一端有一个真人敲打着键盘,盯着上面提到的屏幕。只有一端有文件描述符,另一端只是连接器和电缆。

从历史上看,终端已经开发了许多可以由运行在其上的程序控制的属性(例如“回声模式”或“规范模式”,请参阅termios (3))此外,终端可以让用户(通过上述连接器和电缆)发送可用于“作业控制”的信号,例如通过键入 CTRL-Z 将前台作业置于后台。

pty 就像一个真正的终端,其中 两端 都是文件描述符:

  • 从属端的行为与真正的终端完全一样:具有从属端描述符的进程(“下级进程”)可以对其进行读取和写入,还可以设置终端属性像回显模式或中断字符(例如 CTRL+C)。它通常甚至不会意识到它没有连接到真实的屏幕和键盘。

  • 主端看起来更像是一个键盘和电传打字机,不是由人类使用,而是由其他进程使用:任何打开主端的进程都可以写入它,并且会收到回显(但仅当劣质进程已在从属设备上设置了ECHO 属性时)。它还可以(在大多数现代 unice 上)控制以从属设备作为其控制终端的会话),例如通过发送 CTRL+Z。

要了解什么是控制终端,考虑一下真实用户在真实终端上登录的场景也是很有用的。用户可以启动一个“会话”,即一组进程,其中一些在前台作业中,另一些在后台。

为了防止混乱,控制终端(即与之关联的内核结构)会跟踪哪些进程处于前台或后台作业中,以及允许哪些进程对其进行读取和写入。每当一个进程尝试非法操作(例如从控制终端读取的后台进程),操作将失败(使用EIO),然后整个作业被内核停止(使用信号SIGTTIN

这表明,与真正的终端一样,只有 pty 的从端可以作为控制终端,并且该概念仅在支持作业控制的 Unix 系统上才有意义(现在任何 Unix 系统)

【讨论】:

  • 我现在明白了,我只是对控制终端有点困惑,控制终端是连接到从机的任何进程还是从机是控制终端?
  • 进程永远不会被称为“终端”。 pty 的从端可以是会话的控制端。会话中最古老的进程称为“会话领导者”(它通常是某种外壳),通常(但不一定)它是指示控制终端将其他进程组置于后台或前台的进程。从某种意义上说,您可以将此过程称为“终端控制器”,但绝不可以称为“控制终端”
  • 哦,我明白了 pty 就像一个虚拟终端程序,管理程序如何交互和使用资源
  • 对不起,如果我不能很好地理解这个概念对我来说并不容易,但你的解释真的很好
  • 请注意此答案和链接文章中相当重要的一点:主端不是终端!因此,如果您和我一样,希望在主控端使用规范的 read(),那么它不会发生 :-(
猜你喜欢
  • 2015-11-14
  • 2019-06-24
  • 2012-03-25
  • 2021-11-07
  • 2013-08-09
  • 2020-03-11
  • 2011-06-06
  • 2012-10-05
  • 2018-12-18
相关资源
最近更新 更多