伪终端

引言

在终端和运行的程序之间有一个终端行规程(见http://www.cnblogs.com/nufangrensheng/p/3575752.html中的图18-2),经过它咱们可以在终端上设置特殊字符(退格、行删除、中断等)。可是,当一个登录请求到达网络链接时,终端行规程并非自动被加载到网络链接和登录程序shell之间的。 html

概述

伪终端这个术语暗示对于一个应用程序而言,它看上去像一个终端,但事实上伪终端并非一个真正的终端下图显示了使用伪终端时相关进程的典型结构。其中关键点以下: typescript

    一般一个进程打开伪终端设备,而后调用fork。子进程创建了一个新会话,打开一个相应的伪终端从设备,将其描述符复制到标准输入、标准输出和标准出错,而后调用exec。伪终端从设备成为子进程的控制终端。 shell

  1. 对于伪终端从设备上的用户进程来讲,其标准输入、标准输出和标准出错都是终端设备。对于这些文件描述符,用户进程可以调用终端I/O章节中介绍的全部输入/输出函数。可是由于在伪终端从设备之下并无真正的终端设备,无心义的函数调用(改变波特率、发送中断符、设置奇偶校验等)将被忽略。
  2. 任何写道伪终端设备的东西都会做为从设备的输入,反之亦然。事实上全部从设备端的输入都来自于伪终端主设备上的用户进程。这看起来像一个双向管道,但从设备上的终端行规程使咱们拥有普通管道没有的其余处理能力。

咱们一般用pty表示伪终端,而用tty表示终端。 服务器

伪终端的典型用途

  1. 网络登陆服务器

    伪终端可用于构造网络登陆服务器。典型的例子是telnetd和rlogind服务器。一旦登录shell运行在远端主机上,便可获得以下图所示的结构。Telnetd服务器使用相似的结构。 网络

    在rlogind服务器和登陆shell之间有两个exec调用,这是由于login程序一般是在两个exec之间检验用户是否合法。 函数

    本图的另外一个关键点是驱动PTY主设备的进程一般同时在读写另外一个I/O流。图中另外一个I/O流是TCP/IP框。这表示该进程必然使用了如select或poll那样的I/O多路转接,或被分红两个进程或线程。 spa

  2. script程序

    script(1)程序是随大多数UNIX系统提供的,它将终端会话的全部输入和输出信息复制到一个文件中。它将本身置于终端和登陆shell的一个新调用之间,从而完成此工做。下图详细描述了script程序中有关的交互。这里要特别指出,script程序一般是从登陆shell启动的,该shell而后等待script程序的结束。 线程

    Script程序运行时,位于PTY从设备之上的终端行规程的全部输出都被复制到script文件中(一般叫作typescript)。由于击键一般由该行规程模块回显,因此该script文件也包括了输入的内容。可是,由于键入的口令(密码)不被回显,因此该文件不会包含口令。 htm

  3. expect程序

    伪终端能够用来在非交互模式中驱动交互程序的运行。许多程序须要一个终端才能运行,passwd(1)命令就是一个例子,它要求用户在系统提示后输入命令。 blog

    为了支持处理操做模式而修改全部交互式程序,是很是麻烦的。相比之下,一个更好的解决方法是经过一个脚原本驱动交互式程序。Expect程序提供了这样的方法,它使用伪终端来运行其余程序。

  4. 运行协同进程

    程序清单15-10(http://www.cnblogs.com/nufangrensheng/p/3561379.html)所示的协同进程例子中,咱们不能调用使用标准I/O库进行输入、输出的协同进程,这是由于当经过管道与协同进程进行通讯时,标准I/O库会将标准输入和输出的内容放到缓冲区中,从而引发死锁。若是协同进程是一个已经编译的程序而咱们又没有源程序,则没法在源程序中加入fflush语句来解决这个问题。图15-8(http://www.cnblogs.com/nufangrensheng/p/3561379.html)显示了一个进程驱动协同进程的状况。咱们需要作的是将一个伪终端放到两个进程之间(以下图所示),这诱使协同进程认为它是由终端而非另外一个进程驱动的。

    如今协同进程的标准输入和标准输出就像终端设备同样,因此标准I/O库会将这两个流设置为行缓冲。

  5. 观看长时间运行程序的输出

    使用任何一个标准shell,能够将一个须要长时间运行的程序放到后台去运行。可是若是将该程序的标准输出重定向到一个文件,而且它产生的输出又很少,那么咱们就不能方便地监控程序的进展,这是由于标准I/O库会将标准输出所有放在缓冲区中。咱们看到的将只是标准I/O库函数写到输出文件中的成块输出,有时甚至是大到8192字节的一块。

    若是有源程序,则能够加入fflush调用。另外一种方法是,能够在pty程序下运行该程序,让标准I/O库认为标准输出是终端。下图说明了这个结构,咱们将这个缓慢输出的程序称为slowout。从登陆shell到pty进程的fork/exec箭头用 虚线表示,以强调pty进程是做为后台任务运行的。

相关文章
相关标签/搜索