首先说一下什么叫做 Pseudo terminal deveces(虚拟终端设备/假终端)
虚拟终端设备就是用来给远程终端用的虚拟设备。比如你用Putty或者其他什么工具连接到linux上,就会给你分配一个虚拟终端设备,比如pts/1, pts/2, etc. 而不是必须需要一个物理终端。这样我们就可以通过虚拟终端对远程设备进行操作了。
进入正题:
int openpty(int *amaster, int *aslave, char *name, struct termios *termp,
struct winsize *winp);
这个函数首先尝试获取一个可用的虚拟终端。如果成功获取,紧接着它就试图改变slave device的UID为当前进程的UID,该进程的拥有者得到了对虚拟终端的读写权限。如果参数name不为空,那么openpty()将slave pty的路径赋值给它。如果参数termp和winp不空,openpty()分别初始化termp和winp所指向的结构体。当函数返回的时候,为master和slave打开的文件描述符会分别返回给amaster和aslave。
int forkpty(int *amaster, char *name, struct termios *termp,
struct winsize *winp);
forpty()函数首先调用openpty()函数来获得可用的虚拟终端。如果成功,它会利用fork()新建一个进程,子进程会关掉master 终端的文件描述符,然后调用 login_tty()启动slave的终端。forkpty()的参数意义与openpty()的相同。
int login_tty(int fd);
login_tty()为终端准备一个新的登录session。传给它的参数文件描述符 fd 必须是一个可读写的终端设备,然后交给调用的的进程控制。
以上这些是我看FreeBSD的manul手册翻译加理解的,如果大家觉得翻译的不好,可以自己man一下。

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑