tcgetattr 和 tcsetattr
头文件
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);//&= ~ 是关闭的意思//|= 是打开的意思//最后要记得恢复原来终端的参数
转自链接
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
