头文件
include <termios.h>
tcgeattr
tcgetattr函数,用来获取终端参数,成功返回零;失败则返回非零,发生失败接口将设置errno标识。
tcsetattr
tcsetattr函数,用来设置终端参数,成功返回零;失败则返回非零,发生失败接口将设置errno标识。
- 函数原型
int tcgetattr(int fd, struct termios *termios_p);
参数fd为终端的文件描述符,返回的结果保存在termios 结构体中。
int tcsetattr(int fd, int optional_actions,
const struct termios *termios_p);
参数fd为终端的文件描述符,参数optional_actions用于控制修改
起作用的时间,而结构体termios_p中保存了要修改的参数。
- 终端文件描述符
系统默认自动为进程的标准输入文件在文件描述符0上打开,标准输出文件在文件描述符1上打开,标准出错在文件描述符2上打开。通常情况下,是将输入设备(键盘)打开并复制到进程的标准输入(0)、将输出设备(显示器)打开并复制到标准输出(1)和标准出错(2)。(来自于这里)
-struct termios结构体
//有关结构体的定义
struct termios
{
tcflag_t c_iflag; /* input mode flags */
tcflag_t c_oflag; /* output mode flags */
tcflag_t c_cflag; /* control mode flags */
tcflag_t c_lflag; /* local mode flags */
cc_t c_line; /* line discipline */
cc_t c_cc[NCCS]; /* control characters */
speed_t c_ispeed; /* input speed */
speed_t c_ospeed; /* output speed */
#define _HAVE_STRUCT_TERMIOS_C_ISPEED 1
#define _HAVE_STRUCT_TERMIOS_C_OSPEED 1
};
-
c_iflag
输入模式标志,控制终端输入方式
键 值 | 说 明 |
---|---|
IGNBRK | 忽略BREAK键输入 |
BRKINT | 如果设置了IGNBRK,BREAK键的输入将被忽略,如果设置了BRKINT ,将产生SIGINT中断 |
IGNPAR | 忽略奇偶校验错误 |
PARMRK | 标识奇偶校验错误 |
INPCK | 允许输入奇偶校验 |
ISTRIP | 去除字符的第8个比特 |
INLCR | 将输入的NL(换行)转换成CR(回车) |
IGNCR | 忽略输入的回车 |
ICRNL | 将输入的回车转化成换行(如果IGNCR未设置的情况下) |
IUCLC | 将输入的大写字符转换成小写字符(非POSIX) |
IXON | 允许输入时对XON/XOFF流进行控制 |
IXANY | 输入任何字符将重启停止的输出 |
IXOFF | 允许输入时对XON/XOFF流进行控制 |
IMAXBEL | 当输入队列满的时候开始响铃,Linux在使用该参数而是认为该参数总是已经设置 |
-
c_oflag
输出模式标志,控制终端输出方式
键 值 | 说 明 |
---|---|
OPOST | 处理后输出 |
OLCUC | 将输入的小写字符转换成大写字符(非POSIX) |
ONLCR | 将输入的NL(换行)转换成CR(回车)及NL(换行) |
OCRNL | 将输入的CR(回车)转换成NL(换行) |
ONOCR | 第一行不输出回车符 |
ONLRET | 不输出回车符 |
OFILL | 发送填充字符以延迟终端输出 |
OFDEL | 以ASCII码的DEL作为填充字符,如果未设置该参数,填充字符将是NUL(‘\0’)(非POSIX) |
NLDLY | 换行输出延时,可以取NL0(不延迟)或NL1(延迟0.1s) |
CRDLY | 回车延迟,取值范围为:CR0、CR1、CR2和 CR3 |
TABDLY | 水平制表符输出延迟,取值范围为:TAB0、TAB1、TAB2和TAB3 |
BSDLY | 空格输出延迟,可以取BS0或BS1 |
VTDLY | 垂直制表符输出延迟,可以取VT0或VT1 |
FFDLY | 换页延迟,可以取FF0或FF1 |
- c_cflag
控制模式标志,指定终端硬件控制信息
键 值 | 说 明 |
---|---|
CBAUD | 波特率(4+1位)(非POSIX) |
CBAUDEX | 附加波特率(1位)(非POSIX) |
CSIZE | 字符长度,取值范围为CS5、CS6、CS7或CS8 |
CSTOPB | 设置两个停止位 |
CREAD | 使用接收器 |
PARENB | 使用奇偶校验 |
PARODD | 对输入使用奇偶校验,对输出使用偶校验 |
HUPCL | 关闭设备时挂起 |
CLOCAL | 忽略调制解调器线路状态 |
CRTSCTS | 使用RTS/CTS流控制 |
- c_lflag
本地模式标志,控制终端编辑功能
键 值 | 说 明 |
---|---|
ISIG | 当输入INTR、QUIT、SUSP或DSUSP时,产生相应的信号 |
ICANON | 使用标准输入模式 |
XCASE | 在ICANON和XCASE同时设置的情况下,终端只使用大写。如果只设置了XCASE,则输入字符将被转换为小写字符,除非字符使用了转义字符(非POSIX,且Linux不支持该参数) |
ECHO | 显示输入字符 |
ECHOE | 如果ICANON同时设置,ERASE将删除输入的字符,WERASE将删除输入的单词 |
ECHOK | 如果ICANON同时设置,KILL将删除当前行 |
ECHONL | 如果ICANON同时设置,即使ECHO没有设置依然显示换行符 |
ECHOPRT | 如果ECHO和ICANON同时设置,将删除打印出的字符(非POSIX) |
TOSTOP | 向后台输出发送SIGTTOU信号 |
- c_cc[NCCS]
控制字符,用于保存终端驱动程序中的特殊字符,如输入结束符等
宏 | 说 明 | 宏 | 说 明 |
---|---|---|---|
VINTR | Interrupt字符 | VEOL | 附加的End-of-file字符 |
VQUIT | Quit字符 | VTIME | 非规范模式读取时的超时时间 |
VERASE | Erase字符 | VSTOP | Stop字符 |
VKILL | Kill字符 | VSTART | Start字符 |
VEOF | End-of-file字符 | VSUSP | Suspend字符 |
VMIN | 非规范模式读取时的最小字符数 |
- optional_actions
用于控制修改起作用的时间
键值 | 说明 |
---|---|
TCSANOW | 不等数据传输完毕就立即改变属性。 |
TCSADRAIN | 等待所有数据传输结束才改变属性。 |
TCSAFLUSH | 清空输入输出缓冲区才改变属性。 |
-
错误信息
EBADF:非法的文件描述符。
EINTR:tcsetattr函数调用被信号中断。
EINVAL:参数optional_actions使用了非法值,或参数termios中使用了非法值。
ENCTTY:非终端的文件描述符。 -
设置键值的方式
struct termios oldt, newt;
tcgetattr(0, &oldt);/获取终端参数
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
//&= ~ 是关闭的意思
//|= 是打开的意思
//最后要记得恢复原来终端的参数
转自链接