伪终端是指对于一个应用程序而言,他看上去像一个终端,但事实上它并不是一个真正的终端。
- 进程打开伪终端设备,然后fork。子进程建立一个新的会话,打开一个相应的伪终端从设备。复制输入、输出和标准错误文件描述符,调用exec,子进程从设备编程伪终端。
- 伪终端能像终端一样,但是无意义的函数调用如改变波特率、发送中断符、设置奇偶校验将被忽略。
- 伪终端可以做输入和输出。
posix_opent函数提供了一种可移植的方法来打开下一个可用伪终端主设备
#include <stdlib.h> #include <fcntl.h> int posix_openpt(int flags); 返回值:成功返回下一个可用的PTY主设备文件描述符,出错-1 flags:设备操作标记,可以是0或者以下两项的之一,O_RDWR允许对设备同时进行读写操作,此标记通常需要指定
O_NOCTTY不将设备作为进程的控制终端
在伪终端从设备可用之前,它的权限必须设置,以便应用程序可以访问它。
改变指定master对应从设备的属主与访问权限
#define _XOPEN_SOURCE #include <stdlib.h> int grantpt(int fd);
int unlockpt(int fd);
返回值:成功0,出错-1
fd:文件描述符
ptsname返回PTY从设备的名字
#define _XOPEN_SOURCE #include <stdlib.h> char *ptsname(int fd); #define _GNU_SOURCE #include <stdlib.h> int ptsname_r(int fd, char *buf, size_t buflen);
fd:文件描述符
apue写的函数,打开下一个可用的PTY主设备。调用者必须分配一个数组来存放主设备或从设备名字。
#include "apue.h" int ptym_open(char *pts_name, int pts_namesz); 返回值:成功返回PTY主设备文件描述符,出错-1 int ptys_open(char *pts_name);
返回值:成功返回PTY设备文件描述符,出错-1
pts_name:打开设备的名字
pts_namesz:缓冲区字节长度
实现函数:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include "apue.h" #include <errno.h> #include <fcntl.h> #if defined(SOLARIS) #include <stropts.h> #endif int ptym_open(char *pts_name, int pts_namesz) { char *ptr; int fdm, err; if((fdm = posix_openpt(O_RDWR)) < 0) return(-1); if(grantpt(fdm) < 0) goto errout; if(unlock(fdm) < 0) goto errout; if((ptr = ptsname(fmd)) == NULL) goto errout; strncpy(pts_name, ptr, pts_namesz); pts_name[pts_namesz - 1] = '