各种平台打开伪终端设备的方法有所不同。在Single UNIX Specification的XSI扩展中包含了很多函数,试图统一这些方法。这些函数的基础是SVR4用于管理基于STREAMS的伪终端的一组函数。
posix_openpt用来打开下一个可用的伪终端主设备,该函数是可移植的。
#include <stdlib.h>
#include <fcntl.h>
int posix_openpt(int oflag);
返回值:若成功则返回下一个可用的PTY主设备的文件描述符,若出错则返回-1
参数oflag是一个位屏蔽字,指定如何打开主设备,它类似于open(2)的oflag参数,但是并不支持所有打开标志。对于posix_openpt,我们可以指定O_RDWR, 要求打开主设备进行读、写;可以指定O_NOCTTY以防止主设备成为调用者的控制终端。其他打开标志都会导致未定义的行为。
grantpt函数提供的功能:在伪终端从设备可被使用之前,必须设置它的权限,使得应用程序可以访问它。它把从设备节点的用户ID设置为调用者的实际用户ID, 设置其组ID为一非指定值,通常是可以访问该终端设备的组。将权限设置为:对单个所有者是读写,对组所有者是写(0620)。
#include <stdlib.h>
int grantpt(int filedes);
int unlockpt(int filedes);
两个函数的返回值: 若成功则返回0,若出错则返回-1
unlockpt函数用于准予对伪终端从设备的访问,从而允许应用程序打开该设备。阻止其他进程打开从设备,使得建立该设备的应用程序有机会在使用主、从设备之前正确地初始化这些设备。
注意,在grantpt和unlockpt这两个函数中,文件描述符是与主伪终端设备关联的文件描述符。
ptsname函数用于在给定主伪终端设备的文件描述符时,找到从伪终端设备的路径名。这使应用程序可以独立于给定平台的某种惯例而标识从设备。注意,该函数返回的名字可能存放在静态存储区中,所以以后的调用可能会覆盖它。
#include <stdlib.h>
char *ptsname(int filedes);
返回值:若成功则返回指向PTY从设备名的指针,若出错则返回NULL
详情可参考apue。