伪终端

伪终端

引言

在终端和运行程序间有一个终端行规程,
通过该规程我们能设置终端的特殊字符【如退格,行删除,中断等】
当一个登录请求到达网络连接时,终端行规程并不是自动被加载到网络连接和登录shell之间的。

概述

伪终端这个术语指的是,对一个应用而言,它看上去像一个终端,但事实上不是一个真正的终端。

伪终端_第1张图片

- 通常,一个进程打开伪终端主设备,调fork。子进程建立新的会话。打开一个相应的伪终端从设备,将其文件描述符复制到标准输入,标准输出,标准错误。然后调exec。伪终端从设备成为子进程的控制终端。
- 对伪终端从设备上的用户进程,其标准输入,标准输出,标准错误都是终端设备。
- 任何写到伪终端主设备的都会作为从设备的输入。反之亦然。
所有从设备端的输入都来自伪终端主设备上的用户进程。
从设备上的终端行规程使我们拥有普通管道没有的其他处理能力。。

伪终端的用途:
1. 网络登录服务器

伪终端_第2张图片

2. 窗口系统终端模拟

伪终端_第3张图片

3. script程序

伪终端_第4张图片

4. expect程序
5. 运行协同进程

伪终端_第5张图片

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

伪终端_第6张图片

打开伪终端设备

在打开PTY设备文件时,
应用程序并不需要设置O_TTY_INIT标识。
各种平台打开伪终端设备的方法有所不同。
	#include 
	#include 
	// 成功,返回下一个可用的PTY主设备文件描述符。
	// 若出错,返回-1
	// 可指定O_RDWR来打开主设备进行读,写
	// 可指定O_NOCTTY来防止主设备成为调用者的控制终端
	int posix_openpt(int oflag);


	// 把从设备节点的用户ID设置为调用者的实际用户ID,设置其组ID为一非指定值。
	// 对个体所有者是读/写
	// 对组所有者是写
	// 实现通常将PTY从设备的组所有者设置为tty组。
	// 把哪些要对系统所有活动终端具有写权限的程序的设置组ID设为tty组
	// 在PTY从设备上tty组的写权限是被允许的
	#include 
	// 成功,返回0。错误,返回-1。
	// fd与伪终端主设备关联。
	int grantpt(int fd);
	int unlockpt(int fd);

	// 给定伪终端主设备的文件描述符
	// ptsname找到伪终端从设备的路径名
	#include 
	// 成功,返回指向PTY从设备名的指针
	// 出错,返回NULL
	char* ptsname(int fd);
grantpt可能需fork并exec一个设置用户ID程序。
unlockpt用于准予对伪终端从设备的访问。从而允许应用打开该设备。

伪终端_第7张图片

	#include "apue.h"
	// 成功,返回PTY主设备文件描述符,出错,返回-1
	int ptym_open(char* pts_name, int pts_namesz);
	// 成功,返回PTY从设备文件描述符,出错,返回-1
	int ptys_open(char* pts_name);

函数pty_fork

	#include "apue.h"
	#include 
	pid_t pty_fork(
		int *ptrfdm, 
		char *slave_name, 
		int slave_namesz,
		const struct termios *slave_termios,
		const struct winsize *slave_winsize);
	Returns: 0 in child, process ID of child in parent,1 on error

你可能感兴趣的:(System--Linux)