在linux中,当创建uinput设备时,将在文件系统中创建与该设备对应的一个或多个事件文件。(例如,如果我创建了一个input鼠标,那么就会创建/dev/For/mouseN文件。)但是,如何确定为给定的uinput设备创建了哪些文件?uinput内核模块似乎没有为获取该信息提供任何ioctl。一种可能的方法是在创建uinput设备后立即轮询文件系统,以查看出现了哪些文件,但是该方法无法工作,因为与其他设备(包括真实设备和uinput设备)的竞争也是在同一时间插入或创建的。我是忽略了什么,还是必须黑进内核才能得到这些信息?
发布于 2013-03-26 12:38:23
如果您查看sysfs,您可以找到您的信息。一旦创建了uinput设备,请执行以下操作:
$ ls /sys/class/input/
event0 event1 ... eventN
input0 input2 ... input19 ... inputN
mouse0 mouse1 ... mouseN
mice
$ ls /sys/devices/virtual/input/
input19 mice注意,您可以在不同的路径中找到虚拟设备。在这种情况下,input19是我的uinput设备。哪个是对应的焦炭装置?
$ ls /sys/devices/virtual/input/input19/
event14 name id ...我的半焦设备是/dev/input/event14。我知道input19是我的uinput设备,因为我是创建uinput设备的唯一用户。如果要确定,必须读取它的sysfs属性名,并验证它确实是您的设备。
$ cat /sys/devices/virtual/input/input19/name
foo-keyboard-201303261446您可以通过读取内核消息来检索有关新的uinput设备的信息:
$ 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路径:
/**
* 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的代码。
发布于 2016-08-25 20:54:15
这是迄今为止我找到的最好的方法,再加上这里给出的答案,我会这样做:
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。
https://stackoverflow.com/questions/15623442
复制相似问题