《UNIX环境高级编程》十九伪终端读书笔记

来源:互联网 发布:淘宝如何认证企业店铺 编辑:程序博客网 时间:2024/05/21 14:47

1、概述

伪终端是指,对于一个应用程序而言,它看上去想一个终端,但事实上它并不是一个真正的终端。
这里写图片描述
- 通常,一个进程打开伪终端主设备,然后调用fork。子进程建立一个新的会话,打开一个相应的伪终端从设备,将其文件描述符复制到标准输入、标准输出和标准错误,然后调用exec。伪终端从设备称为子进程的控制终端。
- 对于伪终端从设备上的用户进程来说,其标准输入、标准输出和标准错误都是终端设备。
- 任何写到伪终端主设备的都会作为从设备的输入,反之亦然。事实上,所有从设备端的输入都来自于伪终端主设备上的用户进程。

伪终端的典型用途:

1、网络登录服务器。

这里写图片描述
注:驱动PTY主设备的进程通常同时在读写另一个I/O流。本例中另一个I/O流是TCP/IP框。这表示该进程必然使用了某种形式的诸如select或poll这样的I/O多路转接,或者被分成两个进程或线程。

2、窗口系统终端模拟

这里写图片描述

3、srcipt程序

这里写图片描述

4、expect程序

5、运行协同程序

我们不能调用使用标准I/O库进行输入、输出的协同进程,这是因为当通过管道与协同进程进行通信时,标准I/O库会完全缓冲标准输入和标准输出,从而引起死锁。
可以将一个伪终端放到两个进程之间,诱使协同进程认为它是由终端驱动的,而非另一个进程。
这里写图片描述
现在协同进程的标准输入和标准输出就像终端设备一样,所以标准I/O库会将这两个流设置称行缓冲。

6、观看长时间运行程序的输出

这里写图片描述

2、打开伪终端设备

#include <stdlib.h>#include <fcntl.h>int posix_openpt(int olag);//若成功,返回下一个可用的PTY主设备文件描述符;若出错,返回-1

参数oflag是一个位屏蔽字,指定如何打开主设备:
O_RDWR:打开主设备进行读、写。
O_NOCTTY:防止主设备称为调用者的控制终端。

#include <stdlib.h>int grantpt(int fd);int unlockpt(int fd);//若成功,返回0;若出错,返回-1

grantpt函数更改PTY从设备的权限:把从设备节点的用户ID设置为调用者的实际用户ID,设置其组ID为一非指定值,通常是可以访问该终端设备的组。权限被设置为:对个体所有者是读/写,对组所有者是写(0620).
unlockpt函数用于准予对伪终端从设备的访问,从而允许应用程序打开该设备。

注:上面两个函数中文件描述符参数是与伪终端主设备关联的文件描述符。

如果给定了伪终端主设备的文件描述符,可以用ptsname函数找到伪终端从设备的路径名:

#include <stdlib.h>char *ptsname(int fd);//若成功,返回指向PTY从设备名的指针,若出错,返回NULL;
0 0
原创粉丝点击