c++ - 使用/dev/input/eventX 和 c/c++ 的设备事件处理

标签 c++ c linux events device-driver

我需要检测某种类型的设备(例如鼠标)并使用守护进程在 Linux 中捕获它的事件。

Xlib 的使用似乎没有用,因为Xlib 只能捕获应用程序创建的窗口事件,而不是所有系统事件(但如果我错了,请纠正我) .

解决方案之一是使用 /dev/input/eventX 文件(其中 X 是数字)。在带有 ls -l by-id 的命令行中,我可以检测到哪个事件文件处理特定设备。

进一步的谷歌搜索让我找到了 libevdev .它实际上是系统调用的包装器(您甚至必须在使用 libevdev 处理此文件之前手动获取事件文件的文件描述符),但它还可以找出此设备之前可以发出的事件的类型和代码这些事件被发出。但我不能使用它,因为将它嵌入到目标计算机上有一些困难。

所以问题是:我可以在不解析 ls -l by-id 输出的情况下使用 C/C++ 执行此操作吗?我的意思是我可以检测绑定(bind)到特定 /dev/input/eventX 文件的设备类型,或者至少获取它可以仅通过系统调用发出的事件类型吗?

在其他 Linux 中是否有检测设备事件的解决方案?

提前致谢。

=======

[UPD]:除了@AlejandroDiaz 在这篇文章的评论中给出的解决方案之外的另一种解决方案(顺便说一句,没有找到如何粘贴对某些评论的引用)而不使用 libevdev 正在使用 ioctl 读取事件位并像这样解析它们:

int c_iHd = open("/dev/input/event0", O_RDONLY | O_NONBLOCK);
if(c_iHd == -1)
{
    exit(1);
}
unsigned long c_uEventBits;
ioctl(c_iHd, EVIOCGBIT(0, EV_MAX), &c_uEventBits);
int hasButtonsEvent = (c_uEventBits >> EV_KEY) & 1;
close(c_iHd);

this thread 中描述了详细的解决方案.

最佳答案

libevdev的核心比较简单,无非就是一个read()读入一组struct input_event。它们在 linux/input.h 中定义,您可以从中获取类型、代码和值。

libevdev 提供的大部分内容都是类型安全的,因此您不能搞砸 ioctls 和一些事件处理的极端情况(其中大部分与多点触控有关)。

如果您的需求相当简单明了,直接编写代码也同样有效,尤其是在连静态链接都不是一个选项的情况下。然后您只需要 open()、read() 和 ioctl()。

关于c++ - 使用/dev/input/eventX 和 c/c++ 的设备事件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33258007/

相关文章:

c - 使用O_DIRECT打开的文件中的seek()和read()

linux - 启动 xampp 时出现错误,错误缺少作业名称

c++ - #define 错误

c++ - 具有 Long 和指针的结构的默认构造函数

c - 如何在 VSCode 中为 C 制作 Makefile?

c++ - 建议将 cpp 代码转换为 UML 类图的工具

c++ - 在 MacOSX 上,在 C++ 中,如何在没有自旋锁的情况下通过共享内存进行进程间通信?

c++ - 将int位转换为逐字浮点并打印

c - C99 中是否有固定大小的 float 和 double 类型?

澄清以理解 C 变量