Linux C实现实时获取键盘按键

在Linux系统中,termios结构体用于表示终端接口的各种配置选项。通过修改termios结构体中的相应字段,可以控制终端的各种行为,包括将终端设置为原始模式(raw mode)。原始模式下的终端通常用于需要高精度键盘输入的程序,如某些游戏或者需要检测按键扫描码的低级输入处理程序。

1. 包含必要的头文件

c 复制代码
#include <termios.h>
#include <unistd.h>

2. 保存原始的终端设置

首先,需要获取并保存终端的当前配置,以便之后可以恢复。

c 复制代码
struct termios orig_termios;
tcgetattr(STDIN_FILENO, &orig_termios);

这里,STDIN_FILENO是标准输入文件描述符(通常为0)。tcgetattr函数用于获取与该文件描述符关联的终端配置。

3. 修改终端配置

接下来,创建一个新的termios结构体实例,并对其进行修改:

c 复制代码
struct termios new_termios = orig_termios;

然后,修改new_termios结构体中的相关字段:

  • ICANON:这是一个标志位,用于启用/禁用标准输入处理(canonical mode)。在原始模式下,ICANON应该被禁用,这样每个按键将立即产生输入,而不是等到按下回车键。
  • ECHO:这个标志位用于控制终端是否回显输入字符。在原始模式下,通常也禁用ECHO。
  • VMINVTIME:这两个字段用于控制非标准模式下的输入行为。在原始模式下,通常将VMIN设置为1,这样只要有输入就可以立即读取,而不是等待一定数量的输入或超时。
c 复制代码
new_termios.c_lflag &= ~(ICANON | ECHO);
new_termios.c_cc[VTIME] = 0;
new_termios.c_cc[VMIN] = 1;

4. 应用新的终端设置

使用tcsetattr函数将新的配置应用到终端:

c 复制代码
tcsetattr(STDIN_FILENO, TCSANOW, &new_termios);

TCSANOW表示立即改变配置。

5. 检测按键输入

在原始模式下,程序可以使用getchar()read()函数来检测按键输入。由于禁用了ICANON,每个按键将立即产生一个输入字节。

6. 恢复原始的终端设置

在程序结束时,应该恢复终端的原始配置,以避免影响其他依赖于终端设置的程序:

c 复制代码
tcsetattr(STDIN_FILENO, TCSANOW, &orig_termios);

7. 完整案例

c 复制代码
#include <stdio.h>
#include <unistd.h>
#include <termios.h>

int main() {
    struct termios orig_termios;
    int ch;

    while(1){
	    // 保存原始的终端设置
	    tcgetattr(STDIN_FILENO, &orig_termios);
	
	    // 设置新的终端设置
	    struct termios new_termios = orig_termios;
	    new_termios.c_lflag &= ~(ICANON | ECHO);
	    new_termios.c_cc[VTIME] = 0;
	    new_termios.c_cc[VMIN] = 1;
	    tcsetattr(STDIN_FILENO, TCSANOW, &new_termios);
	
	    // 检测按键
	    ch = getchar();
	
	    // 恢复原始的终端设置
	    tcsetattr(STDIN_FILENO, TCSANOW, &orig_termios);
	    printf("\nYou pressed: %c\n", ch);
	    printf("\nstate:%d\n",ch=='A');
	}
    return 0;
}
相关推荐
Yana.nice17 分钟前
Linux 只保留 30 天内日志(find命令删除日志文件)
linux·运维·chrome
DFT计算杂谈4 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
人邮异步社区4 小时前
怎么把C语言学到精通?
c语言·开发语言
Zhang~Ling5 小时前
从 fopen 到 struct file:从零开始拆解 Linux 文件 I/O
linux·运维·服务器
DeeplyMind5 小时前
Linux 深入 per-VMA lock:Linux 缺页路径如何摆脱 mmap_lock
linux·per-vma lock
爱写代码的森5 小时前
蒙三方库 | harmony-utils之FileUtil文件重命名与属性查询详解
linux·运维·服务器·华为·harmonyos·鸿蒙·huawei
XMAIPC_Robot6 小时前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
重生的黑客7 小时前
Linux 进程优先级、切换与调度:从孤儿进程到 O(1) 调度模型
linux·运维·服务器·进程优先级·nice
骑上单车去旅行8 小时前
MD5校验对比脚本
linux·服务器·windows
平生幻8 小时前
Linux 常用命令
linux