`

伪终端概述

阅读更多
    伪终端就是指,一个应用程序看上去像一个终端,但事实上它并不是个真正的终端。下图显示了使用伪终端时相关进程的典型安排。

    图中的关键点如下。
    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 进程是作为后台任务运行的。

  • 大小: 7.8 KB
  • 大小: 8.7 KB
  • 大小: 11.1 KB
  • 大小: 10.1 KB
分享到:
评论

相关推荐

    Unix环境高级编程19

    19.2 概述伪终端的概念,指出它不是一个真实的终端设备,而是一个软件实现的接口,让进程能够像操作终端一样进行交互。典型的伪终端进程结构包括一个父进程打开主设备,然后fork出子进程,子进程会将从设备设为自己...

    中国移动 M2M平台与终端接口规范_WMMP_V2.0

    **WMMP协议概述** WMMP是一种专为M2M业务设计的通信协议,它支持长连接和短连接两种模式,并定义了一系列通信过程中的应答方式、异常处理机制等。 ##### 6. **WMMP协议通信方式** - **6.1 长连接**:用于保持...

    企业网络安全概述.pptx

    伪源IP访问请求 DNS、FTP、WEB服务器 受害主机 受感染终端 受感染终端 受感染终端 受感染终端 受感染终端 发送指令:攻击开始! 企业网络安全概述全文共23页,当前为第6页。 传输过程中截取篡改数据 中心站点 分支...

    超级终端开发嵌入式linux指南

    - LCD显示输出支持包括单色、伪彩和真彩液晶屏幕。 - VGA显示输出支持最大刷新率80Hz。 ### 开发板操作系统与驱动 **支持的操作系统**: - 支持Linux 2.4.18内核版本和Windows CE 4.21.2操作系统。 **Bootloader*...

    UNIX环境高级编程(18到23章)

    第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伪分布模式是一种在单台机器上模拟分布式环境的方式,通常用于开发测试阶段。这种方式既能够体验到Hadoop的分布式特性,又不需要复杂的多节点集群配置。本文将详细介绍如何在Ubuntu系统上搭建...

    GNSS拒止环境下的伪卫星指纹定位方法.docx

    #### 二、伪卫星技术概述 伪卫星技术作为一种新兴的室内定位解决方案,通过地面导航发射器模拟GNSS信号来实现室内定位。这种技术能够在不改变现有智能终端硬件的情况下,通过软件升级提供连续的室内外定位服务。伪...

    基于SUPL状态机的AGPS终端的软件实现

    - MSA(Mobile Station Assisted): 终端仅负责捕获GPS信号并测量伪距,基站完成解算并回送位置信息。相较于传统GPS定位,MSA模式具有更短的首次定位时间、更高的定位精度、更好的信号捕获能力和更低的终端功耗。 ...

    UNIX环境高级编程_第2版.part1

     关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在  此基础上介绍了多个应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附  录中给...

    UNIX环境高级编程_第2版.part2

     关系、信号、线程、线程控制、守护进程、各种I/O、进程间通信、网络IPC、伪终端等方面的内容,还在  此基础上介绍了多个应用实例,包括如何创建数据库函数库以及如何与网络打印机通信等。此外,还在附  录中给...

    SDH网络概述与原理

    SDH网络通常由终端复用器(TM)、分插复用器(ADM)、再生中继器(REG)、交叉连接设备(DXC)等设备组成。这些设备共同作用,实现信号的接入、交叉连接、再生和传输。 **第五章 SDH网络结构和网络保护机理** SDH...

    linux_串口驱动开发文档

    在Linux系统中,TTY不仅包括传统的串行终端,还涵盖了虚拟终端、伪终端(PTY)等多种类型。 #### 二、TTY驱动的核心功能 TTY驱动的核心位于标准字符驱动层级之下,并为终端类型设备提供统一接口。该核心主要负责:...

    UNIX环境高级编程第二版

    - **伪终端通信**:通过伪终端进行数据传输的具体实现。 #### 15. 应用示例 - **数据库函数库**:创建一个简单的数据库函数库的过程。 - **网络打印机通信**:如何编写代码与网络打印机进行通信。 - **综合案例分析...

    UNIX环境高级编程_第二版中文

    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章 数据库函数库...

    电信设备-一种基于用户计算机终端的桌面信息采集系统及采集方法.zip

    4. **实现方法**:提供具体的编程语言、开发工具和框架的选择,以及代码示例或伪代码,展示如何实现信息采集和处理功能。 5. **性能评估**:通过实验或模拟测试,展示系统的效率、稳定性和资源占用情况。 6. **案例...

Global site tag (gtag.js) - Google Analytics