linux /dev/uinput,linux uinput:简单示例?

我有一些问题让 双方 使用的代码边uinput工作。

基于uinput入门:用户级别输入子系统[死链接;存档 ]我总结了以下 作家 (减去错误处理):

int main(int ac, char **av)

{

int fd = open("/dev/uinput", O_WRONLY | O_NONBLOCK);

int ret = ioctl(fd, UI_SET_EVBIT, EV_ABS);

ret = ioctl(fd, UI_SET_ABSBIT, ABS_X);

struct uinput_user_dev uidev = {0};

snprintf(uidev.name, UINPUT_MAX_NAME_SIZE, "uinput-rotary");

uidev.absmin[ABS_X] = 0;

uidev.absmax[ABS_X] = 255;

ret = write(fd, &uidev, sizeof(uidev));

ret = ioctl(fd, UI_DEV_CREATE);

struct input_event ev = {0};

ev.type = EV_ABS;

ev.code = ABS_X;

ev.value = 42;

ret = write(fd, &ev, sizeof(ev));

getchar();

ret = ioctl(fd, UI_DEV_DESTROY);

return EXIT_SUCCESS;

}

这似乎可行,至少input_event似乎已编写了完整的结构。

然后,我写出了我最能想到的事件的天真的 读者 :

int main(int ac, char **av)

{

int fd = open(av[1], O_RDONLY);

char name[256] = "unknown";

ioctl(fd, EVIOCGNAME(sizeof(name)), name);

printf("reading from %s\n", name);

struct input_event ev = {0};

int ret = read(fd, &ev, sizeof(ev));

printf("Read an event! %i\n", ret);

printf("ev.time.tv_sec: %li\n", ev.time.tv_sec);

printf("ev.time.tv_usec: %li\n", ev.time.tv_usec);

printf("ev.type: %hi\n", ev.type);

printf("ev.code: %hi\n", ev.code);

printf("ev.value: %li\n", ev.value);

return EXIT_SUCCESS;

}

不幸的是,读者方面根本无法工作。每次只能读取8个字节,这几乎不是完整的input_event结构。

我犯了什么愚蠢的错误?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值