`

伪终端概述

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

    图中的关键点如下。
    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
分享到:
评论

相关推荐

    企业网络安全概述.pptx

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

    M2M平台与终端接口规范(WMMP)V2.0.pdf

    5. WMMP协议概述 3 6. WMMP协议通信方式 4 6.1. 长连接 4 6.2. 短连接 5 6.3. 协议端口 6 6.4. 交互过程中的应答方式 6 6.5. 通信过程中的异常与重发 6 6.6. 数据包流水号 7 7. WMMP功能及流程 7 7.1. 终端序列号...

    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 ...

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

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

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

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

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

    高级UNIX编程 pdf 电子书

    4.10 伪终端 练习 第5章 进程和线程 5.1 概述 5.2 环境 5.3 exeo系统调用 5.4 实现shell(版本1) 5.5 fork系统调用 5.6 实现shell(版本2) 5.7 exit系统调用和进程终止 5 8 wait、waitpid和waitid系统调用 5.9 信号、...

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

    19.3.1 基于STREAMS的伪终端 547 19.3.2 基于BSD的伪终端 549 19.3.3 基于Linux的伪终端 551 19.4 pty_fork函数 553 19.5 pty程序 555 19.6 使用pty程序 559 19.7 高级特性 564 19.8 小结 565 习题...

    UNIX环境高级编程

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

    unix环境编程电子书

    524 18.10 规范模式 529 18.11 非规范模式 532 18.12 终端的窗口大小 537 18.13 termcap,terminfo和curses 539 18.14 小结 540 习题 540 第19章 伪终端 541 19.1 引言 541 19.2 概述 541 19.3 ...

    FreeBSD操作系统设计与实现

    第2章 FreeBSD设计概述 2.1 FreeBSD的功能和内核 2.2 内核结构 2.3 内核服务 2.4 进程管理 2.4.1 信号 2.4.2 进程组和会话 2.5 内存管理 2.5.1 BSD内存管理设计要点 2.5.2 内核中的内存管理 2.6 I/O系统 2.6.1 描述...

    UNIX环境高级编程部分

    19.3 打开伪终端设备 19.3.1 SVR4 19.3.2 4.3+BSD 19.4 pty_fork函数 19.5 pty程序 19.6 使用pty程序 19.6.1 utmp文件 19.6.2 作业控制交互 19.6.3 检查长时间运行程序的输出 19.6.4 script程序 19.6.5 运行协同进程...

    UNIX高级编程 计算机科学丛书

    6. 实例—一个数据库的函数库(第十六章)、与Postscrip打印机的通信(第十七章)、调制解调器拨号程序(第十八章)以及使用伪终端(第十九章)。 如果对C语言较熟悉并具有某些应用Unix的经验,那么对阅读本书是...

    UNIX环境高级编程 pdf格式

    19.3 打开伪终端设备 480 19.3.1 SVR4 481 19.3.2 4.3+BSD 482 19.4 pty_fork函数 484 19.5 pty程序 486 19.6 使用pty程序 489 19.7 其他特性 494 19.8 小结 495 习题 495 附录A 函数原型 497 附录B 其他源代码 512 ...

    UNIX环境高级编程(PDF)

    PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威, 概念清晰精辟,一直以来被誉为UNIX编程的“圣经”,对于所有UNIX程序员—无论是初学者还是专家级人士 —都是一...

    UNIX环境高级编程 不扣分哦

    在此基础上,分别按章介绍了多个应用实例,包括如何创建数据库函数库,PostScript 打印机驱动程序,调制解调器拨号器及在伪终端上运行其他程序的程序等。 本书内容丰富权威,概念清晰精辟,一直以来被誉为UNIX编程的...

Global site tag (gtag.js) - Google Analytics