本文主要根据APUE总结了和终端/伪终端相关的函数。
记录终端信息的两个资料库:
termcap:源于BSD,老版本。
terminfo”源于systemV,新版本,已取代termcap。
echo $TERM
可以查看当前终端
infocmp $yourterm
查看资料库中你的终端的信息
stty -a #查看termios结构的情况
posix定义的在输入时的做特殊处理的11个字符:
CR \R
回车,不能更改
NL \N
换行,不能更改
EOF ^D
文件结束
INTR ^C
中断信号
SUSP ^Z
挂起信号
QUIT ^退出信号
EOL
行结束
ERASE ^H
向前擦除一个字符
KILL ^U
擦行
START ^Q
恢复输出
STOP ^S
停止输出
伪终端PTY就是对应用程序它看起来像终端,实际它并不是一个真正的终端,伪终端通常是成对出现。
伪终端作用:
1.构造网络登陆服务器
2.script程序
3.expect程序
4.运行协同进程
5.观看长时间运行程序的输出
linux的终端就是:tty*
linux的pty就是:ptmx+
pts*
#####################################################
终端相关库函数
#####################################################
#include<termios.h>
#include<unistd.h>
可以检测和更改的终端设备特性都包含在termios结构中:
输入模式
输出模式
控制模式
本地模式
特殊控制字符
structtermios
{
tcflag_tc_iflag; //输入
tcflag_tc_oflag; //输出
tcflag_tc_cflag; //控制
tcflag_tc_lflag; //本地
cc_t c_cc[NCCS]; //
特殊控制字符
};
NCCS在posix中一般是11个,linux扩展为32个。
在下面名字前面加V用来做c_cc数组下标。
CR \R
回车,不能更改
NL \N
换行,不能更改
EOF ^D
文件结束
INTR ^C
中断信号
SUSP ^Z
挂起信号
QUIT ^退出信号
EOL
行结束
ERASE ^H
向前擦除一个字符
KILL ^U
擦行
START ^Q
恢复输出
STOP ^S
停止输出
终端属性操作,成功返回0,失败返回-1.
inttcgetattr(int fd, struct termios *termios_p);
获取终端属性。
inttcsetattr(int fd, int optional_action, const struct termios*termios_p);
设置终端属性。
opt:指定设置的终端属性什么时候起作用。
TCSANOW:更改立即发生
TCSADRAIN:发送了所有输出后更改才发生,用于更改输出参数。
TCSAFLUSH:发送了所有输出后更改才发生,在更改发生时未读的所有数据都被删除。
行控制函数:
inttcdrain(int fd);
等待所有输出都被发送。
inttcsendbreak(int fd, int duration);
在指定时间区间发送连续0位流。
duration=0:发送延续0.25-0.5秒。
inttcflow(int fd, int action);
用于对输入和输出流控制进行控制。
action:
TCOOFF:输出被挂起
TCOON:重新启动以前被挂起的输出。
TCIOFF:系统发送一个STOP字符,使终端设备暂停发送数据。
TCION:系统发送一个START字符,使终端恢复发送数据。
inttcflush(int fd, int queue_selector);
发送输入缓冲区和输出缓冲区中未决的数据。
queue_selector:
TCIFLUSH:刷清输入队列
TCOFLUSH:刷清输出队列
TCIOFLUSH:刷清输入、输出队列
波特率相关函数:
speed_tcfgetispeed(const struct termios *termios_p);
speed_tcfgetospeed(const struct termios *termios_P);
返回输入/输出的波特率。
intcfsetispeed(struct termios *termios_p, speed_t speed);
intcfsetospeed(struct termios *termios_p, speed_t speed);
设置输入/输出速度,成功返回0,失败返回-1.
speed:取下列值,参考手册。
B50\B75\B110\B134\B150\B200\B300\B600\B1200\B1800\B2400...
B0:禁用调制调节器的控制线。
前台进程组ID:
pid_ttcgetsid(int fd);
返回会话首进程的进程组ID,失败返回-1.
pid_ttcgetpgrp(int fd);
返回前台进程组的进程组ID,出错返回-1.
inttcsetpgrp(int fd, pid_t pgrp);
设置前台进程组ID,成功返回0,失败返回-1.
#####################################################
终端相关的其它库函数
#####################################################
#include<unistd.h>
intisatty(int fd);
测试文件描述符是否指向终端。是返回1,否返回0.
char*ttyname(int fd);
返回指向终端路径名的指针,出错返回NULL。
#include<stdio.h>
char*ctermid(char *s);
成功返回指向控制终端名的指针,出错返回指向空字符串的指针。
如果s非空和返回值相同。
#####################################################
伪终端相关的库函数
#####################################################
#include<stdlib.h>
#include<fcntl.h>
intposix_openpt(intflags);
打开一个伪终端主设备,成功返回下一个可用的pty主设备的文件描述符,失败返回-1.
flags:
O_RDWR:打开伪终端用于读写,一般使用这个标识。
O_NOCTTY:防止伪终端设备成为调用进程的控制终端。
intgrantpt(int fd);
给伪终端从设备授权,成功返回0,失败返回-1.
intunlockpt(int fd);
解锁伪终端主从设备对,使得伪终端设备可以被访问。
char*ptsname(int fd);
获取伪终端从设备的名称,成功返回指向pty从设备名的指针,失败返回NULL。
未完待续......