You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置新uinput设备使其可发送任意按键事件?

无需逐个设置按键位的uinput设备配置方案

针对uinput创建键盘设备时需要逐个调用ioctl(fd, UI_SET_KEYBIT, ...)的冗余、脆弱问题,有两种简洁可靠的解决方法:

1. 循环覆盖所有按键位

利用内核定义的KEY_MAX常量(对应最大按键索引),通过循环一次性设置所有按键位,代码简洁且无需手动维护单个按键:

#include <linux/uinput.h>

// 先启用按键事件类型
ioctl(fd, UI_SET_EVBIT, EV_KEY);

// 遍历所有按键索引,批量设置按键位
for (int key = 0; key <= KEY_MAX; key++) {
    ioctl(fd, UI_SET_KEYBIT, key);
}

后续内核新增按键时,只要KEY_MAX同步更新,代码无需修改,彻底解决脆弱性问题。

2. 直接操作按键位掩码(高效进阶)

uinput设备的按键位存储在内核侧的位图结构中,你可以通过UI_GET_KEYBIT获取位图长度,直接填充全1掩码写入:

#include <linux/uinput.h>
#include <string.h>
#include <stdlib.h>

ioctl(fd, UI_SET_EVBIT, EV_KEY);

// 获取按键位图的字节长度
unsigned int bit_size;
ioctl(fd, UI_GET_KEYBIT, &bit_size);

// 分配并填充全1的掩码
unsigned char *key_bits = malloc(bit_size);
memset(key_bits, 0xff, bit_size);

// 写入内核
write(fd, key_bits, bit_size);
free(key_bits);

这种方式避免了循环调用ioctl的开销,效率更高,适合对性能有要求的场景。

以上两种方法配置后,你的uinput键盘设备即可发送任意按键事件,无需再逐个设置单个按键位。

内容的提问来源于stack exchange,提问作者Tenders McChiken

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 23:25:07