美文网首页LinuxLinux学习之路
APUE读书笔记-19伪终端(6)

APUE读书笔记-19伪终端(6)

作者: QuietHeart | 来源:发表于2020-10-02 18:41 被阅读0次

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标记没有任何作用。

相关文章

  • APUE读书笔记-19伪终端(6)

    3、打开伪终端设备 SUS尝试统一的伪终端处理函数 我们打开伪终端设备的方式随平台有所不同。Single UNIX...

  • APUE读书笔记-19伪终端(15)

    (6)通过非交互的方式驱动交互程序 尽管我们觉得pty可以运行任何协作处理进程(甚至一个协作处理进程是交互的进程)...

  • APUE读书笔记-19伪终端(16)

    (7)pty程序的do_driver函数 通过我们自己写的被pty调用的driver程序,我们可以以任何需要的方式...

  • APUE读书笔记-19伪终端(5)

    查看长时间运行的程序的输出 如果我们有一个程序,那个程序运行很长的时间,我们可以在任何一种标准的shell下面将这...

  • APUE读书笔记-19伪终端(2)

    2、概述 伪终端的意思是,这个终端对于应用程序来说表现像是一个终端,但是实际上它并不是一个真正的终端。下面的图就展...

  • APUE读书笔记-19伪终端(9)

    (3)基于Linux的伪终端 Linux提供访问伪终端的BSD方法,所以可以使用上面代码中同样的函数在Linux上...

  • APUE读书笔记-19伪终端(14)

    (4)script程序 使用pty程序,我们可以如下通过shell脚本执行script程序: 当我们运行这个she...

  • APUE读书笔记-19伪终端(17)

    远程模式 通过使用ioctl的TIOCREMOTE命令,PTY master可以设置PTY slave为远程模式。...

  • APUE读书笔记-19伪终端(3)

    伪终端的典型应用 我们现在将会看看一些伪终端的典型使用。 网络登录服务 伪终端被编译成支持网络登录的服务。典型的例...

  • APUE读书笔记-19伪终端(8)

    (2)基于BSD的伪终端 在基于BSD的系统中,和基于Linux的系统中,我们提供了自己的XSI函数版本。 在我们...

网友评论

    本文标题:APUE读书笔记-19伪终端(6)

    本文链接:https://www.haomeiwen.com/subject/gitluktx.html