我一直在阅读这个页面上的pty示例: http://www.rkoucha.fr/tech_corner/pty_pdip.html。 我有两个问题:
使用pty和使用管道(pipe)之间的区别,或最重要的区别是什么?从我所了解的来看,两者都用于进程间通信,但使用pty时,进程可以“像正常终端一样处理它”。这是什么意思?
什么是“控制终端”?我已经阅读了相关资料,但无法理解它们究竟是什么。控制终端是否总是分配给进程的pty?
我一直在阅读这个页面上的pty示例: http://www.rkoucha.fr/tech_corner/pty_pdip.html。 我有两个问题:
使用pty和使用管道(pipe)之间的区别,或最重要的区别是什么?从我所了解的来看,两者都用于进程间通信,但使用pty时,进程可以“像正常终端一样处理它”。这是什么意思?
什么是“控制终端”?我已经阅读了相关资料,但无法理解它们究竟是什么。控制终端是否总是分配给进程的pty?
termios(3)
)。此外,终端可以让用户(通过上述连接器和电缆)发送可用于“作业控制”的信号,例如,通过键入CTRL-Z将前台作业放到后台。
伪终端
就像一个真正的终端,两端都是文件描述符:
从属端的行为就像一个真正的终端:具有从属端的进程(“下级进程”)可以从中读取数据,并向其中写入数据,但还可以设置终端属性,例如回显模式或中断字符(例如CTRL + C)。它通常甚至不知道自己未连接到真正的屏幕和键盘。
主端更像是一个键盘和电传打字机,用于其他进程而不是人类。任何已打开主端的进程都可以向其写入,并将获得回显(但仅当从属进程在从端上设置了ECHO
属性时才会有回显)。它还可以(在大多数现代UNIX系统上)控制具有从属进程作为其控制终端的会话,例如通过发送CTRL+Z。
要理解控制终端是什么,再次考虑一个真正的用户在真正的终端登录的情况下。用户可以启动一个“会话”,即一组进程,其中一些进程是前台作业,其他进程则在后台运行。
为了防止混乱,控制终端(即与之关联的内核结构)会跟踪哪些进程处于前台或后台作业,以及哪些进程被允许从中读取和写入。每当进程尝试执行非法操作(如后台进程从控制终端读取),操作将失败(使用EIO
),并且整个作业都将由内核停止(使用信号SIGTTIN
)。
这表明,与真正的终端一样,PTY的从端只能是控制终端,而且该概念只在支持作业控制的UNIX系统上才有意义(现今任何UNIX系统均支持)。