首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何确定与uinput设备对应的文件?

如何确定与uinput设备对应的文件?
EN

Stack Overflow用户
提问于 2013-03-25 19:48:33
回答 2查看 6.8K关注 0票数 4

在linux中,当创建uinput设备时,将在文件系统中创建与该设备对应的一个或多个事件文件。(例如,如果我创建了一个input鼠标,那么就会创建/dev/For/mouseN文件。)但是,如何确定为给定的uinput设备创建了哪些文件?uinput内核模块似乎没有为获取该信息提供任何ioctl。一种可能的方法是在创建uinput设备后立即轮询文件系统,以查看出现了哪些文件,但是该方法无法工作,因为与其他设备(包括真实设备和uinput设备)的竞争也是在同一时间插入或创建的。我是忽略了什么,还是必须黑进内核才能得到这些信息?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-26 12:38:23

如果您查看sysfs,您可以找到您的信息。一旦创建了uinput设备,请执行以下操作:

代码语言:javascript
复制
$ ls /sys/class/input/
event0 event1 ... eventN
input0 input2 ... input19 ... inputN
mouse0 mouse1 ... mouseN
mice

$ ls /sys/devices/virtual/input/
input19 mice

注意,您可以在不同的路径中找到虚拟设备。在这种情况下,input19是我的uinput设备。哪个是对应的焦炭装置?

代码语言:javascript
复制
$ ls /sys/devices/virtual/input/input19/
event14 name id ...

我的半焦设备是/dev/input/event14。我知道input19是我的uinput设备,因为我是创建uinput设备的唯一用户。如果要确定,必须读取它的sysfs属性名,并验证它确实是您的设备。

代码语言:javascript
复制
$ cat /sys/devices/virtual/input/input19/name
foo-keyboard-201303261446

您可以通过读取内核消息来检索有关新的uinput设备的信息:

代码语言:javascript
复制
$ dmesg | tail -n 7
input: foo-keyboard-201303261445 as /devices/virtual/input/input14
input: foo-keyboard-201303261445 as /devices/virtual/input/input15
input: foo-keyboard-201303261445 as /devices/virtual/input/input16
input: foo-keyboard-201303261445 as /devices/virtual/input/input17
input: foo-keyboard-201303261446 as /devices/virtual/input/input18
input: foo-keyboard-201303261446 as /devices/virtual/input/input19
input: foo-keyboard-201303261446 as /devices/virtual/input/input20

从您的程序,您可以阅读从/dev/kmsg和捕捉您的事件。也许您可以打开设备/dev/kmsg,冲洗它,等待select(),直到收到uinput通知。

另一种方法是使用libudev检索用户输入设备。查看以下链接:libudev教程

UPDATE:由于您的问题,我改进了github:费德里科提供的信息上可用的libuinput。我实现了使用hte kmsg设备的解决方案。

更新:2014年,Linux uinput驱动程序得到了改进(git SHA1 e3480a61fc)。现在可以使用以下uinput命令从ioctl驱动程序中直接获取sysfs路径:

代码语言:javascript
复制
/**
 * UI_GET_SYSNAME - get the sysfs name of the created uinput device
 *
 * @return the sysfs name of the created virtual input device.
 * The complete sysfs path is then /sys/devices/virtual/input/--NAME--
 * Usually, it is in the form "inputN"
 */
#define UI_GET_SYSNAME(len)    _IOC(_IOC_READ, UINPUT_IOCTL_BASE, 300, len)

因此,如果您有可能使用比3.13更近的Linux内核,您可以使用上面的ioctl来改进使用uinput的代码。

票数 7
EN

Stack Overflow用户

发布于 2016-08-25 20:54:15

这是迄今为止我找到的最好的方法,再加上这里给出的答案,我会这样做:

如何获取用户输入创建设备的名称(路径)

代码语言:javascript
复制
char sysfs_device_name[16];
ioctl(uinput_fd_after_create, UI_GET_SYSNAME(sizeof(sysfs_device_name)), sysfs_device_name);
printf("/sys/devices/virtual/input/%s\n", sysfs_device_name);
//Now retrieve all files in that folder and grep for event* then
send_input_to_fd = open("the_event[n]", O_WRONLY | O_NDELAY);

现在,send_input_to_fd应该是发送事件的正确FD。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15623442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档