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

时间:2015-10-21 11:20:37

标签: 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 ++吗?我的意思是我可以检测绑定到某个/dev/input/eventX文件的设备类型,或至少获取它只能通过系统调用发出的事件类型吗?

如果有任何解决方案用于检测Linux中的设备事件?

提前致谢。

=======

[UPD]:除了@AlejandroDiaz在此帖子的评论中提供的另一个解决方案(顺便说一下,没有找到如何粘贴对某些评论的引用)而不使用{{ 1}}正在用ioctl读取事件位并解析它们:

libevdev

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

1 个答案:

答案 0 :(得分:0)

libevdev的核心相对简单,只不过是读取一组struct input_event的read()。这些是在linux / input.h中定义的,您可以从中获取类型,代码和值。

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

如果您的需求非常简单明了,直接编写代码也会起作用,尤其是即使静态链接不是一个选项。你需要的只是open(),read()和ioctl()。