Linux学习笔记--查询_唤醒方式读取输入数据
头文件和变量
#include <string.h> // 字符串操作
#include <unistd.h> // read() 函数struct input_event event; // 输入事件结构体
非阻塞模式支持
if (argc == 3 && !strcmp(argv[2], "noblock")) {fd = open(argv[1], O_RDWR | O_NONBLOCK);
} else {fd = open(argv[1], O_RDWR);
}
如果命令行第三个参数是 "noblock",则以非阻塞模式打开设备
O_NONBLOCK
标志使得 read 操作不会阻塞程序
实时事件读取循环
while (1) {len = read(fd, &event, sizeof(event));if (len == sizeof(event)) {printf("get event: type = 0x%x, code = 0x%x, value = 0x%x\n", event.type, event.code, event.value);} else {printf("read err %d\n", len);}
}
struct input_event
结构体
在 linux/input.h
中定义:
struct input_event {struct timeval time; // 时间戳__u16 type; // 事件类型__u16 code; // 事件代码__s32 value; // 事件值
};
事件类型详解
EV_SYN (0x00) - 同步事件
用于标记一组事件的结束
代码通常为
SYN_REPORT
(0)值通常为 0
EV_KEY (0x01) - 按键事件
代码:按键编号(如
KEY_A
,KEY_ENTER
)值:
0:按键释放
1:按键按下
2:按键长按
EV_REL (0x02) - 相对坐标事件
代码:
REL_X
,REL_Y
,REL_WHEEL
等值:相对移动量
EV_ABS (0x03) - 绝对坐标事件
代码:
ABS_X
,ABS_Y
,ABS_PRESSURE
等值:绝对坐标值
阻塞模式(默认)
./01_get_input_info /dev/input/event0
程序会阻塞在 read() 调用,直到有输入事件发生。
非阻塞模式
./01_get_input_info /dev/input/event0 noblock
程序会立即返回,如果没有事件则显示错误信息。