本文目录
在 Linux 中,termios
是一个结构体类型,用于控制终端 I/O 接口的设置。这个结构体以及相关的函数和宏定义在 <termios.h>
头文件中。termios
结构体定义了各种控制字符、输入和输出模式、控制模式和本地模式,这些设置可以用来配置终端设备的行为。
termios
结构体定义
termios
结构体的定义因系统而异,但通常包含以下成员:
struct termios {
tcflag_t c_iflag; // 输入模式标志
tcflag_t c_oflag; // 输出模式标志
tcflag_t c_cflag; // 控制模式标志
tcflag_t c_lflag; // 本地模式标志
cc_t c_cc[NCCS]; // 控制字符数组
};
各成员的含义如下:
c_iflag
(输入模式标志):用于控制输入数据的处理方式。c_oflag
(输出模式标志):用于控制输出数据的处理方式。c_cflag
(控制模式标志):用于控制硬件特性(如波特率、字符大小、停止位等)。c_lflag
(本地模式标志):用于控制终端功能(如回显、信号处理等)。c_cc
(控制字符数组):用于存储特殊控制字符(如 EOF、EOL、INTR 等)。
常用函数
与 termios
相关的常用函数包括:
-
tcgetattr
:-
功能:获取终端的当前属性。
-
原型:
int tcgetattr(int fd, struct termios *termios_p);
-
参数:
fd
:终端文件描述符。termios_p
:指向termios
结构体的指针,用于存储当前属性。
-
-
tcsetattr
:-
功能:设置终端的属性。
-
原型:
int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
-
参数:
fd
:终端文件描述符。optional_actions
:指定属性更改时的行为(如立即生效、在所有输出数据已传输后生效等)。termios_p
:指向termios
结构体的指针,包含新的属性。
-
-
cfsetispeed
和cfsetospeed
:-
功能:设置输入和输出波特率。
-
原型:
int cfsetispeed(struct termios *termios_p, speed_t speed); int cfsetospeed(struct termios *termios_p, speed_t speed);
-
参数:
termios_p
:指向termios
结构体的指针。speed
:波特率值(如B9600
)。
-
-
tcflush
:-
功能:丢弃数据。
-
原型:
int tcflush(int fd, int queue_selector);
-
参数:
fd
:终端文件描述符。queue_selector
:指定应丢弃的数据队列(如输入队列、输出队列等)。
示例代码
-
以下是一个使用 termios
结构体配置终端属性的示例代码:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <termios.h>
int main() {
struct termios tty;
// 获取当前终端属性
if (tcgetattr(STDIN_FILENO, &tty) != 0) {
perror("tcgetattr");
return 1;
}
// 修改终端属性
tty.c_lflag &= ~(ICANON | ECHO); // 关闭回显和规范模式
tty.c_cc[VMIN] = 1; // 最小读取字符数
tty.c_cc[VTIME] = 0; // 超时
// 设置新的终端属性
if (tcsetattr(STDIN_FILENO, TCSANOW, &tty) != 0) {
perror("tcsetattr");
return 1;
}
// 从终端读取字符
char c;
while (read(STDIN_FILENO, &c, 1) > 0 && c != 'q') {
printf("Read: %c\n", c);
}
// 恢复原来的终端属性
tty.c_lflag |= (ICANON | ECHO);
if (tcsetattr(STDIN_FILENO, TCSANOW, &tty) != 0) {
perror("tcsetattr");
return 1;
}
return 0;
}
此示例程序通过 termios
结构体关闭了终端的规范模式和回显功能,读取单个字符并输出,直到读取到字符 'q'
。然后恢复原来的终端属性。