Mar*_*oll 3 linux file linux-device-driver
在linux中创建uinput设备时,会在文件系统中创建与该设备对应的一个或多个事件文件.(例如,如果我创建了一个输入鼠标,则创建文件/ dev/input/mouseN.)但是,如何确定为给定的输入设备创建了哪些文件?uinput内核模块似乎没有提供任何ioctl来获取该信息.一种可能的方法是在创建uinput设备之后立即轮询文件系统以查看显示的文件,但是这种方法不起作用,因为与其他设备(包括真实输入和uinput)的比赛也在同一时间插入或创建.我忽略了什么,或者我必须破解内核才能获得这些信息?
如果你查看sysfs,你可以找到你的信息.创建了uinput设备后,请执行以下操作:
$ ls /sys/class/input/
event0 event1 ... eventN
input0 input2 ... input19 ... inputN
mouse0 mouse1 ... mouseN
mice
$ ls /sys/devices/virtual/input/
input19 mice
Run Code Online (Sandbox Code Playgroud)
请注意,您可以在其他路径中找到虚拟设备.在这种情况下,input19是我的输入设备.哪个是对应的char设备?
$ ls /sys/devices/virtual/input/input19/
event14 name id ...
Run Code Online (Sandbox Code Playgroud)
我的char设备是/dev/input/event14
.我知道这input19
是我的输入设备,因为我是唯一一个创建输入设备的用户.如果您想确定,您必须阅读其sysfs属性名称并验证它确实是您的设备
$ cat /sys/devices/virtual/input/input19/name
foo-keyboard-201303261446
Run Code Online (Sandbox Code Playgroud)
您可以通过读取内核消息来检索有关新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
Run Code Online (Sandbox Code Playgroud)
从您的程序中,您可以阅读/dev/kmsg
并捕捉您的活动.也许你可以打开设备/dev/kmsg
,冲洗它,等待select()
直到你收到输入通知.
另一种方法是使用libudev来检索您的输入设备.看一下以下链接:libudev教程
更新:感谢您的问题,我改进了我的libuinput库,可以在github上找到:libderinput由Federico提供.我实现了使用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)
Run Code Online (Sandbox Code Playgroud)
因此,如果您有可能使用比3.13更新的Linux内核,则可以使用上述内容ioctl
来改进使用uinput的代码.