gpt4 book ai didi

linux - 如何判断uinput设备对应的文件?

转载 作者:可可西里 更新时间:2023-11-01 11:43:39 52 4
gpt4 key购买 nike

在 linux 中,当创建一个 uinput 设备时,会在文件系统中创建一个或多个对应于该设备的事件文件。 (例如,如果我创建一个 uinput 鼠标,则会创建文件/dev/input/mouseN。)但是我如何确定为给定的 uinput 设备创建了哪些文件? 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

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

$ ls /sys/devices/virtual/input/input19/
event14 name id ...

我的字符设备是/dev/input/event14。我知道 input19 是我的 uinput 设备,因为我是唯一创建 uinput 设备的用户。如果你想确定,你必须阅读它的 sysfs 属性 name 并验证它确实是你的设备

$ 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 tutorial

更新:感谢您的问题,我改进了 github 上可用的 libuinput 库:libuinput by Federico .我实现了使用 hte kmsg 设备的解决方案。

更新:2014 年,Linux uinput 驱动程序得到改进 (git SHA1 e3480a61fc)。现在可以使用以下 ioctl 命令直接从 uinput 驱动程序获取 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 的代码。

关于linux - 如何判断uinput设备对应的文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15623442/

52 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com