我一直在阅读此网页上的ptys示例:http://rachid.koucha.free.fr/tech_corner/pty_pdip.html。我有两个问题:
使用pty和使用管道有什么区别或最重要的区别?从我所看到的,两者都是用于进程间通信,但是有了pty,进程可以像对待普通终端一样对待它。那是什么意思?
什么是"控制终端"?我已经阅读过它们,但无法理解它们到底是什么。控制终端总是分配给流程的pty吗?
答案 0 :(得分:13)
你提到的article非常好,很难改进,但它很技术性。我会试着给出一个不太技术性的解释(跟我一起,Unix大师!)
管道只是一个单向数据通道:它只能在一端写入,而在另一端读取。对于双向进程间通信,您始终需要两个管道。管道非常适合移动钻头,但不是很多。
pty (伪终端)可以在两端读写,但它不仅仅是双向数据通道。要理解这一点,看看真正的终端是很有用的:一端有一个进程读取击键并将字符发送到电传打字机或屏幕。另一方面,有一个真正的人在敲打键盘并盯着上面提到的屏幕。只有一端有文件描述符,另一端只是一个连接器和一根电缆。
从历史上看,终端已经开发出许多可以由其上运行的程序控制的属性(如“回声模式”或“规范模式”,请参阅termios (3)
)此外,终端可以让用户(通过例如,上述连接器和电缆的信号发送信号可以用于“作业控制”通过键入CTRL-Z将前台作业放入后台。
pty
就像一个真正的终端,其中两端是文件描述符:
slave end 的行为与真正的终端完全相同:具有从属端描述符(“劣质进程”)的进程可以读取和写入,但也可以设置终端属性如回显模式或中断字符(例如CTRL + C)。它通常甚至不会意识到没有连接到真正的屏幕和键盘。
主端看起来更像是键盘和电传打字,不是由人类使用,而是由其他进程使用:打开主端的任何进程都可以写入,以及将接收回声(但仅当下级进程在从站上设置了ECHO
属性时)。它也可以(在大多数现代统一)上控制具有从属设备作为其控制终端的会话,例如,发送CTRL + Z。
要了解控制终端是什么,考虑真实用户在真实终端登录的情况再次有用。用户可以启动“会话”,即一组进程,其中一些在前台作业,另一些在后台。
为了防止混乱,控制终端(即与其相关联的内核结构)跟踪前台或后台作业中的哪些进程,以及允许哪些进程从中读取和写入。每当进程尝试非法操作(如从控制终端读取后台进程)时,操作将失败(使用EIO
),然后内核停止整个作业(使用信号SIGTTIN
)< / p>
这表明,就像真正的终端一样,只有pty的slave端可以作为控制终端,并且这个概念只适用于支持作业控制的Unix系统(现在任何Unix系统)< / p>