pty和pipe之间的区别

18

我一直在阅读这个页面上的pty示例: http://www.rkoucha.fr/tech_corner/pty_pdip.html。 我有两个问题:

  • 使用pty和使用管道(pipe)之间的区别,或最重要的区别是什么?从我所了解的来看,两者都用于进程间通信,但使用pty时,进程可以“像正常终端一样处理它”。这是什么意思?

  • 什么是“控制终端”?我已经阅读了相关资料,但无法理解它们究竟是什么。控制终端是否总是分配给进程的pty?


我的问题不好吗?我没有看到答案,想知道我问错了什么。 - kprincipe
2
不,你的问题很好(我记得我自己也曾经想过这个问题)。但是,它非常广泛,难以用非技术性的语言回答,而你提到的文章已经非常好了。我会尝试在下面给出一个答案。 - Hans Lub
对于PTYs,还可以参考http://en.wikipedia.org/wiki/Pseudo_terminal。 - nos
1个回答

22
您提到的文章非常出色,难以改进,但它相当技术性。我将尝试给出一个不太技术的解释(请原谅,Unix大师!) 管道只是一个单向数据通道:只能在一端写入,并在另一端读取。对于双向进程间通信,您总是需要两个管道。管道非常适合传输位,但用途不大。 伪终端可以在两端读写,但它远不止是双向数据通道。为了理解这一点,有必要看看一个真正的终端:一端有一个进程读取按键并将字符发送到电传打字机或屏幕。另一端有一个真正的人在敲击键盘和盯着上述屏幕。只有一端有文件描述符,另一端只是连接器和电缆。
历史上,终端发展出许多属性,可以由运行在其上的程序控制(如“回显模式”或“规范模式”,请参阅termios(3))。此外,终端可以让用户(通过上述连接器和电缆)发送可用于“作业控制”的信号,例如,通过键入CTRL-Z将前台作业放到后台。 伪终端就像一个真正的终端,两端都是文件描述符:
  • 从属端的行为就像一个真正的终端:具有从属端的进程(“下级进程”)可以从中读取数据,并向其中写入数据,但还可以设置终端属性,例如回显模式或中断字符(例如CTRL + C)。它通常甚至不知道自己未连接到真正的屏幕和键盘。

  • 主端更像是一个键盘和电传打字机,用于其他进程而不是人类。任何已打开主端的进程都可以向其写入,并将获得回显(但仅当从属进程在从端上设置了ECHO属性时才会有回显)。它还可以(在大多数现代UNIX系统上)控制具有从属进程作为其控制终端的会话,例如通过发送CTRL+Z。

要理解控制终端是什么,再次考虑一个真正的用户在真正的终端登录的情况下。用户可以启动一个“会话”,即一组进程,其中一些进程是前台作业,其他进程则在后台运行。

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

这表明,与真正的终端一样,PTY的从端只能是控制终端,而且该概念只在支持作业控制的UNIX系统上才有意义(现今任何UNIX系统均支持)。


我现在理解得更好了,只是对控制终端有点困惑,控制终端是连接到从属进程的任何进程吗?还是从属进程就是控制终端? - kprincipe
1
一个进程从来不被称为“终端”。pty的从属端可以成为会话的控制终端。会话中最早运行的进程被称为“会话领导者”(通常是某种类型的shell),通常(但不一定)是指示控制终端将其他进程组置于后台或前台的进程。在某种意义上,您可以称此进程为“终端控制器”,但绝不能称其为“控制终端”。 - Hans Lub
哦,我明白了。pty 就像一个虚拟终端程序,管理程序如何交互和使用资源。 - kprincipe
如果我没有完全理解这个概念,请原谅,这对我来说并不容易,但是你的解释真的很好。 - kprincipe
注意此答案及链接文章中的重要部分:主控端是终端!因此,如果您像我一样期望在主控端上进行规范读取(canonical read()),那么很遗憾,它不会发生 :-( - carveone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接