C++

termios的用法 [GPT]


avatar
GuoYulong 2024-06-11 174

在 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 相关的常用函数包括:

  1. tcgetattr

    • 功能:获取终端的当前属性。

    • 原型:

      int tcgetattr(int fd, struct termios *termios_p);
    • 参数:

      • fd:终端文件描述符。
      • termios_p:指向 termios 结构体的指针,用于存储当前属性。

  1. tcsetattr

    • 功能:设置终端的属性。

    • 原型:

      int tcsetattr(int fd, int optional_actions, const struct termios *termios_p);
    • 参数:

      • fd:终端文件描述符。
      • optional_actions:指定属性更改时的行为(如立即生效、在所有输出数据已传输后生效等)。
      • termios_p:指向 termios 结构体的指针,包含新的属性。
  2. cfsetispeedcfsetospeed

    • 功能:设置输入和输出波特率。

    • 原型:

      int cfsetispeed(struct termios *termios_p, speed_t speed);
      int cfsetospeed(struct termios *termios_p, speed_t speed);
    • 参数:

      • termios_p:指向 termios 结构体的指针。
      • speed:波特率值(如 B9600)。
  3. 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'。然后恢复原来的终端属性。

相关阅读

注意!!!

新增会员中心页面,方便管理个人账户,充值功能暂不开启,请勿为本网站进行任何充值活动!!!

通知!!!

① 过年好!!!拖更几个月了已经,年后继续更新!!