- 浏览: 141084 次
文章分类
最新评论
伪终端就是指,一个应用程序看上去像一个终端,但事实上它并不是个真正的终端。下图显示了使用伪终端时相关进程的典型安排。
图中的关键点如下。
1、通常,一个进程打开伪终端主设备,然后调用 fork。子进程建立一个新的会话,打开一个相应的伪终端从设备,并将其文件描述符复制到标准输入、标准输出和标准错误,然后调用 exec。伪终端从设备成为子进程的控制终端。
2、对于伪终端从设备上的用户进程来说,其标准输入、标准输出和标准错误都是终端设备。用户进程可以通过这些描述符来处理类似 tcgetattr 等的终端 I/O 函数。但因为伪终端从设备不是真正的终端设备,所以无意义的函数调用(如改变波特率、发送中断符、设置奇偶校验等)将被忽略。
3、任何写到伪终端主设备的都会作为从设备的输入,反之亦然。事实上,所有从设备端的输入都来自于伪终端主设备上的用户进程。这类似于一个双向管道,只是从设备上的终端行规程(见终端 I/O 综述)使之拥有普通管道没有的其他处理能力。
下面来看看伪终端的某些典型用途。为了简化图示,下面各图中不再画出上图中的“读函数和写函数”,同时使用缩写“PTY”来表示伪终端。
一、网络登录服务器
伪终端可用于构造提供网络登录的服务器。典型的例子是 telnetd 和 rlogind 服务器。一旦登录 shell 运行在远端主机上,即可得到类似下图中所示 rlogind 服务器的进程安排。
图中在 rlogind 服务器和登录 shell 之间有两个 exec 调用,这是因为 login 程序通常是在两个 exec 之间检验用户是否合法。另一个关键点是,驱动 PTY 主设备的进程通常同时在读写另一个 I/O 流,图中的另一个 I/O 流是 TCP/IP 框。这表示该进程必然使用了某种形式的诸如 select 或 poll 这样的 I/O 多路转接,或者被分成两个进程或线程。
二、窗口系统终端模拟
窗口系统通常提供一个终端模拟器,它作为 shell 和窗口管理器之间的媒介。每个 shell 在自己的窗口中执行。这种情况的进程安排如下图所示。
shell 将自己的标准输入、标准输出、标准错误连接到 PTY 的从设备端。终端模拟器程序打开 PTY 的主设备,它除了作为窗口子系统的接口,还要负责模拟一种特殊的终端。这意味着它需要根据它所模拟的设备类型来响应返回码。这些码列在 termcap 和 terminfo 数据库中(见终端窗口大小和 termcap)。
当用户改变终端模拟器窗口的大小时,窗口管理器会通知终端模拟器。终端模拟器在 PTY 的主设备端发出 TIOCSWINSZ ioctl 命令来设置从设备的窗口大小。如果新的窗口大小和当前的不同,内核会发送一个 SIGWINCH 信号给前台 PTY 从设备的进程组。如果应用程序在窗口大小改变时需要重绘屏幕,它就会捕捉该信号,然后发出 TIOCSWINSZ ioctl 命令来获得新的屏幕尺寸并重绘屏幕。
三、script 程序
script(1)程序会将终端会话期间的所有输入和输出信息复制到一个文件中。为此,它将自己置于终端和一个新调用的登录 shell 之间。script 程序通常是从登录 shell 启动的,该 shell 还要等待 script 程序的终止。下图描述了和 script 程序有关的交互。
script 程序运行时,位于 PTY 从设备上的终端行规程的所有输出都将复制到脚本文件中(通常称为 typescript)。注意,由于击键通常由该行规程模块回显,所以该脚本文件中也包括了输入的内容(不过键入的口令一般不回显,因此通常不会包含口令)。
四、expect 程序
伪终端可以用来在非交互模式中驱动交互式程序的运行。expect 程序就可以通过一个脚本来驱动交互式程序,并且它还提供了一种编程语言用于检查运行程序的输出,以确定用什么作为输入发送给该程序。当一个源自脚本的交互式的程序正在运行时,不能仅仅是将脚本中的所有内容复制到程序中去,或者将程序的输出送至脚本,而是必须要向程序发送某个输入,检查它的输出,并决定下一步发送给程序的内容。
五、观看长时间运行程序的输出
标准 shell 可以将一个需要长时间运行的程序放到后台运行,但如果该程序的标准输出重定向到一个文件,并且它产生的输出又不多,那么就不能方便地监控程序的进展,因为标准 I/O 库将完全缓冲它的标准输出,导致看到的只是标准 I/O 库函数写到输出文件中的成块输出。
如果有源程序,则可以加入 fflush 调用强制标准 I/O 缓冲区在某些节点冲洗或者使用
setvbuf 函数(流和缓冲)把缓冲模式改成行缓冲。而如果没有源程序,则可以考虑编写一个程序 pty 来运行该程序,这个 pty 程序可以让标准 I/O 库认为标准输出是终端,以此达到设置行缓冲的目的。下图显示的就是利用伪终端运行一个缓慢输出的程序 slowout 的进程安排情况。其中用虚线表示从登录 shell 到 pty 进程的 fork/exec 箭头是为了强调 pty 进程是作为后台任务运行的。
图中的关键点如下。
1、通常,一个进程打开伪终端主设备,然后调用 fork。子进程建立一个新的会话,打开一个相应的伪终端从设备,并将其文件描述符复制到标准输入、标准输出和标准错误,然后调用 exec。伪终端从设备成为子进程的控制终端。
2、对于伪终端从设备上的用户进程来说,其标准输入、标准输出和标准错误都是终端设备。用户进程可以通过这些描述符来处理类似 tcgetattr 等的终端 I/O 函数。但因为伪终端从设备不是真正的终端设备,所以无意义的函数调用(如改变波特率、发送中断符、设置奇偶校验等)将被忽略。
3、任何写到伪终端主设备的都会作为从设备的输入,反之亦然。事实上,所有从设备端的输入都来自于伪终端主设备上的用户进程。这类似于一个双向管道,只是从设备上的终端行规程(见终端 I/O 综述)使之拥有普通管道没有的其他处理能力。
下面来看看伪终端的某些典型用途。为了简化图示,下面各图中不再画出上图中的“读函数和写函数”,同时使用缩写“PTY”来表示伪终端。
一、网络登录服务器
伪终端可用于构造提供网络登录的服务器。典型的例子是 telnetd 和 rlogind 服务器。一旦登录 shell 运行在远端主机上,即可得到类似下图中所示 rlogind 服务器的进程安排。
图中在 rlogind 服务器和登录 shell 之间有两个 exec 调用,这是因为 login 程序通常是在两个 exec 之间检验用户是否合法。另一个关键点是,驱动 PTY 主设备的进程通常同时在读写另一个 I/O 流,图中的另一个 I/O 流是 TCP/IP 框。这表示该进程必然使用了某种形式的诸如 select 或 poll 这样的 I/O 多路转接,或者被分成两个进程或线程。
二、窗口系统终端模拟
窗口系统通常提供一个终端模拟器,它作为 shell 和窗口管理器之间的媒介。每个 shell 在自己的窗口中执行。这种情况的进程安排如下图所示。
shell 将自己的标准输入、标准输出、标准错误连接到 PTY 的从设备端。终端模拟器程序打开 PTY 的主设备,它除了作为窗口子系统的接口,还要负责模拟一种特殊的终端。这意味着它需要根据它所模拟的设备类型来响应返回码。这些码列在 termcap 和 terminfo 数据库中(见终端窗口大小和 termcap)。
当用户改变终端模拟器窗口的大小时,窗口管理器会通知终端模拟器。终端模拟器在 PTY 的主设备端发出 TIOCSWINSZ ioctl 命令来设置从设备的窗口大小。如果新的窗口大小和当前的不同,内核会发送一个 SIGWINCH 信号给前台 PTY 从设备的进程组。如果应用程序在窗口大小改变时需要重绘屏幕,它就会捕捉该信号,然后发出 TIOCSWINSZ ioctl 命令来获得新的屏幕尺寸并重绘屏幕。
三、script 程序
script(1)程序会将终端会话期间的所有输入和输出信息复制到一个文件中。为此,它将自己置于终端和一个新调用的登录 shell 之间。script 程序通常是从登录 shell 启动的,该 shell 还要等待 script 程序的终止。下图描述了和 script 程序有关的交互。
script 程序运行时,位于 PTY 从设备上的终端行规程的所有输出都将复制到脚本文件中(通常称为 typescript)。注意,由于击键通常由该行规程模块回显,所以该脚本文件中也包括了输入的内容(不过键入的口令一般不回显,因此通常不会包含口令)。
四、expect 程序
伪终端可以用来在非交互模式中驱动交互式程序的运行。expect 程序就可以通过一个脚本来驱动交互式程序,并且它还提供了一种编程语言用于检查运行程序的输出,以确定用什么作为输入发送给该程序。当一个源自脚本的交互式的程序正在运行时,不能仅仅是将脚本中的所有内容复制到程序中去,或者将程序的输出送至脚本,而是必须要向程序发送某个输入,检查它的输出,并决定下一步发送给程序的内容。
五、观看长时间运行程序的输出
标准 shell 可以将一个需要长时间运行的程序放到后台运行,但如果该程序的标准输出重定向到一个文件,并且它产生的输出又不多,那么就不能方便地监控程序的进展,因为标准 I/O 库将完全缓冲它的标准输出,导致看到的只是标准 I/O 库函数写到输出文件中的成块输出。
如果有源程序,则可以加入 fflush 调用强制标准 I/O 缓冲区在某些节点冲洗或者使用
setvbuf 函数(流和缓冲)把缓冲模式改成行缓冲。而如果没有源程序,则可以考虑编写一个程序 pty 来运行该程序,这个 pty 程序可以让标准 I/O 库认为标准输出是终端,以此达到设置行缓冲的目的。下图显示的就是利用伪终端运行一个缓慢输出的程序 slowout 的进程安排情况。其中用虚线表示从登录 shell 到 pty 进程的 fork/exec 箭头是为了强调 pty 进程是作为后台任务运行的。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1249在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
终端窗口大小和 termcap
2018-05-29 22:39 792多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 944终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 567尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 935虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 707tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 810终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 433终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 575在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 944在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 612在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 490消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 481有 3 种称作 XSI IPC ... -
IPC 通信之 FIFO
2018-02-06 22:55 413FIFO 也被称为命名管道,未命名的管道只能在两个相关 ... -
IPC 通信之管道
2018-01-30 22:22 383管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 879readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 451POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 588记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 433UNIX 系统中,守护进程遵循下列通用惯例。 ... -
守护进程编写规则与出错记录
2017-12-26 01:53 450在编写守护进程程 ...
相关推荐
19.2 概述伪终端的概念,指出它不是一个真实的终端设备,而是一个软件实现的接口,让进程能够像操作终端一样进行交互。典型的伪终端进程结构包括一个父进程打开主设备,然后fork出子进程,子进程会将从设备设为自己...
**WMMP协议概述** WMMP是一种专为M2M业务设计的通信协议,它支持长连接和短连接两种模式,并定义了一系列通信过程中的应答方式、异常处理机制等。 ##### 6. **WMMP协议通信方式** - **6.1 长连接**:用于保持...
伪源IP访问请求 DNS、FTP、WEB服务器 受害主机 受感染终端 受感染终端 受感染终端 受感染终端 受感染终端 发送指令:攻击开始! 企业网络安全概述全文共23页,当前为第6页。 传输过程中截取篡改数据 中心站点 分支...
- LCD显示输出支持包括单色、伪彩和真彩液晶屏幕。 - VGA显示输出支持最大刷新率80Hz。 ### 开发板操作系统与驱动 **支持的操作系统**: - 支持Linux 2.4.18内核版本和Windows CE 4.21.2操作系统。 **Bootloader*...
第19章 伪终端 476 19.1 引言 476 19.2 概述 476 19.2.1 网络登录服务器 477 19.2.2 script程序 478 19.2.3 expect程序 479 19.2.4 运行协同进程 479 19.2.5 观看长时间运行程序的输出 479 19.3 打开伪终端设备 480 ...
#### 一、概述 Hadoop伪分布模式是一种在单台机器上模拟分布式环境的方式,通常用于开发测试阶段。这种方式既能够体验到Hadoop的分布式特性,又不需要复杂的多节点集群配置。本文将详细介绍如何在Ubuntu系统上搭建...
#### 二、伪卫星技术概述 伪卫星技术作为一种新兴的室内定位解决方案,通过地面导航发射器模拟GNSS信号来实现室内定位。这种技术能够在不改变现有智能终端硬件的情况下,通过软件升级提供连续的室内外定位服务。伪...
- MSA(Mobile Station Assisted): 终端仅负责捕获GPS信号并测量伪距,基站完成解算并回送位置信息。相较于传统GPS定位,MSA模式具有更短的首次定位时间、更高的定位精度、更好的信号捕获能力和更低的终端功耗。 ...
关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在 此基础上介绍了多个应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附 录中给...
关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在 此基础上介绍了多个应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附 录中给...
SDH网络通常由终端复用器(TM)、分插复用器(ADM)、再生中继器(REG)、交叉连接设备(DXC)等设备组成。这些设备共同作用,实现信号的接入、交叉连接、再生和传输。 **第五章 SDH网络结构和网络保护机理** SDH...
在Linux系统中,TTY不仅包括传统的串行终端,还涵盖了虚拟终端、伪终端(PTY)等多种类型。 #### 二、TTY驱动的核心功能 TTY驱动的核心位于标准字符驱动层级之下,并为终端类型设备提供统一接口。该核心主要负责:...
- **伪终端通信**:通过伪终端进行数据传输的具体实现。 #### 15. 应用示例 - **数据库函数库**:创建一个简单的数据库函数库的过程。 - **网络打印机通信**:如何编写代码与网络打印机进行通信。 - **综合案例分析...
19.3.1 基于STREAMS的伪终端 19.3.2 基于BSD的伪终端 19.3.3 基于Linux的伪终端 19.4 pty_fork函数 19.5 pty程序 19.6 使用pty程序 19.7 高级特性 19.8 小结 习题 第20章 数据库函数库...
4. **实现方法**:提供具体的编程语言、开发工具和框架的选择,以及代码示例或伪代码,展示如何实现信息采集和处理功能。 5. **性能评估**:通过实验或模拟测试,展示系统的效率、稳定性和资源占用情况。 6. **案例...