《UNIX环境高级编程》笔记77--伪终端

1.什么是伪终端

伪终端对于一个程序来说,看上去像一个终端,但事实上并不是一个真正的终端。下图显示了使用伪终端时相关进程
的典型结构。
《UNIX环境高级编程》笔记77--伪终端
1.通常一个进程打开伪终端主设备,然后调用fork。子进程建立了一个新的会话,打开一个相应的伪终端从设备,将其文件
描述符复制到标准输入、标准输出和标准出错,然后调用exec。伪终端从设备成为子进程的控制终端。
2.对于伪终端从设备之上的用户进程来说,其标准输入、标准输出和标准出错都是伪终端设备。对于这些文件描述符,用户
进程可以调用所有的输入输出函数。但是因为在伪终端从设备之下并没有真正的终端设备,无意义的函数调用(改变波特率等)
将被忽略。
3.任何写到伪终端主设备的东西都会作为从设备的输入,反之亦然。事实上所有从设备端的输入都来自于伪终端主设备上的
用户进程。这看起来就像一个双向管道,但从设备上的终端行规程使我们拥有普通管道没有的其他处理能力。

伪终端的典型用途是网络登录服务器rlogind。一旦登录shell运行在远端主机上,即可得到如下如的结构。telnetd服务器使用
类似的结构。
《UNIX环境高级编程》笔记77--伪终端

2.打开伪终端设备

posix_openpt用来打开下一个可用的伪终端主设备,该函数是可移植的。
[cpp] view plain copy
  1. #include<stdlib.h>  
  2. #include<fcntl.h>  
  3. int posix_openpt(int oflag); //成功则返回下一个可用的PTY主设备的文件描述符,出错则返回-1。  
参数oflag是一个位屏蔽字,指定如何打开主设备,它类似于open的oflag参数,但是并不支持所有打开标志。对于posix_openpt,
我们可以指定O_RDWR,要求打开主设备进行读、写;可以指定O_NOCTTY以防止主设备成为调用者的控制终端。其他
打开标志会导致未定义的行为。

在伪终端从设备可被使用之前,必须设置它的权限,使得应用程序可以访问它。grantpt函数提供这样的功能。它把从设备
节点的用户ID设置为调用者的实际用户ID,设置其组ID为一个非指定值,通常是可以访问该终端设备的组。将权限设置为:
对单个所有者是读写,对组所有者是写。
[cpp] view plain copy
  1. #include<stdlib.h>  
  2. int grantpt(int filedes);  
  3. int unlockpt(int filedes);   
  4. //这两个函数返回值:若成功则返回0,出错则返回-1。  
unlockpt函数用于准许对伪终端从设备的访问,从而允许应用程序打开该设备。阻止其他进程打开从设备后,建立该设备的
应用程序有机会在使用主从设备之前正确地初始化这些设备。
注意:在grantpt和unlockpt这两个函数中,文件描述符参数是与主伪终端关联的文件描述符。

ptsname函数用于在给定主伪终端设备的文件描述符时,找到从伪终端设备的路径名。这使应用程序可以独立于给定平台的
某种惯例而标识从设备。注意,该函数返回的名字可能存放在静态存储区中,所以以后的调用可能会覆盖它。
[cpp] view plain copy
  1. #include<stdlib.h>  
  2. char *ptsname(int filedes); //若成功则返回指向PTY从设备名的指针,出错则返回NULL。