APUE读书笔记-19伪终端(6)
3、打开伪终端设备
SUS尝试统一的伪终端处理函数
我们打开伪终端设备的方式随平台有所不同。Single UNIX Specification将一些函数作为XSI扩展,尝试统一这些方法。这些扩展基于一些函数,这些函数原来是用来为System V4提供基于流的伪终端管理。
posix_openpt函数
posix_openpt函数提供了一个可移植的方法,以打开一个可用的伪终端主设备。
#include <stdlib.h>
#include <fcntl.h>
int posix_openpt(int oflag);
返回:如果成功返回下一个可用的PTY master的文件描述符号,如果错误返回1。
oflag参数是一个位掩码,指定主设备如何被打开,它和open函数的参数类似,但是也不是支持所有的open标记。通过使用posix_openpt,我们可以指定O_RDWR打开主设备用于读和写,我们也可以指定O_NOCTTY来阻止主设备变成调用者的控制终端,其他的open标记的行为都是不可知的。
grantpt与unlockpt函数
在一个slave伪终端可以被使用之前,需要设置它的权限,以便应用程序能够访问它。grantpt函数就做了这样的事情,它设置从设备节点的user ID为调用者的real user ID,并设置节点的group ID为一个未指定的值,一般来说,是一些具有访问终端设备权限的组。可以设置权限允许特定的属主进行读写访问以及特定的组属主进行写访问(即0620)。
#include <stdlib.h>
int grantpt(int filedes);
两者返回:如果成功返回0,如果错误返回1。
为了修改从设备节点的权限,grantpt可能需要调用fork和exec一个set-user-ID程序(例如Solaris上面的/usr/lib/pt_chmod)。因此,如果调用者捕获了SIGCHLD信号,那么行为就是不确定的了(捕获了说明子进程停止或者终止了,但是为什么???)。
int unlockpt(int filedes);
unlockpt函数用于给slave伪终端设备赋予访问权限,从而允许应用程序打开设备。通过阻止其他的应用程序打开从(slave)设备,设置设备的应用程序可以有机会在主从设备可以被使用之前,对它们进行合适的初始化。
注意,对于grantpt和unlockpt函数,文件描述符号参数(filedes)是和master(主)伪终端设备关联的文件描述符号。
ptsname函数
ptsname函数可以通过给定的主设备的文件描述符号,获取slave伪终端设备的路径名称。这允许应用程序可以独立于特定平台导致的一些特性,来辨别slave。注意,返回的name可能会被存放在静态内存当中,这样它会被后来的调用覆盖。
#include <stdlib.h>
char *ptsname(int filedes);
返回:如果成功返回一个指向PTY slave的指针,如果错误返回NULL。
一些平台支持的函数
下表列出了Single UNIX Specification所支持的伪终端函数,并且标识了哪些函数在本书所讨论的平台中是被支持的。
XSI的伪终端函数
+--------------------------------------------------------------------------------------------------------------------------+
| Function | Description | XSI | FreeBSD 5.2.1 | Linux 2.4.22 | Mac OS X 10.3 | Solaris 9 |
|--------------+------------------------------------------+-----+---------------+--------------+---------------+-----------|
| grantpt | Change permissions of slave PTY device. | • | • | • | | • |
|--------------+------------------------------------------+-----+---------------+--------------+---------------+-----------|
| posix_openpt | Open a master PTY device. | • | • | | | |
|--------------+------------------------------------------+-----+---------------+--------------+---------------+-----------|
| ptsname | Return name of slave PTY device. | • | • | • | | • |
|--------------+------------------------------------------+-----+---------------+--------------+---------------+-----------|
| unlockpt | Allow slave PTY device to be opened. | • | • | • | | • |
+--------------------------------------------------------------------------------------------------------------------------+
在FreeBSD中,unlockpt什么也不做,O_NOCTTY标记只是为了兼容调用posix_openpt函数的应用程序。FreeBSD在打开一个终端设备的时候,并不会为它分配一个控制终端,所以O_NOCTTY标记没有任何作用。