4

我已经成功设置了一个小程序来创建一个设备,我打算用它来自动测试接收键盘输入事件的应用程序。

我已经按照这个非常好的答案中的两个 教程进行了操作。

当我的程序通过调用新设备来创建 uinput 设备ioctl(fd, UI_DEV_CREATE)时,文件系统中会出现一个新设备,因此我的被测应用程序可以附加到它并等待事件。我的目标系统已经有一个/dev/input/event0设备,所以新的得到了路径/dev/input/event1。如果我为我的桌面系统编译并运行程序,那里有现有的设备/dev/input/event[0-15],当程序运行时,新设备会得到/dev/input/event16

我希望我的程序在创建新设备名称后报告它。有没有办法得到它?

4

2 回答 2

7

是的,如果它在您的平台上可用(例如,Android 出于某种原因没有定义它),您可以使用UI_GET_SYSNAME(defined in )。/usr/include/linux/uinput.h它将为您在 中创建的设备提供一个名称/sys/devices/virtual/input。一旦你知道了sysfs/dev/input中的设备,你就可以通过阅读这个 SO question找出在其中创建的设备。

像这样调用后使用它UI_DEV_CREATE(省略错误/健全性检查):

ioctl(fd, UI_DEV_CREATE);

char sysfs_device_name[16];
ioctl(fd, UI_GET_SYSNAME(sizeof(sysfs_device_name)), sysfs_device_name);
printf("/sys/devices/virtual/input/%s\n", sysfs_device_name);

如果它不可用,您可以尝试查找 sysfs 设备,/proc/bus/input/devices其中应包含以下条目:

I: Bus=0006 Vendor=0001 Product=0001 Version=0001
N: Name="your-uinput-device-name"
P: Phys=
S: Sysfs=/devices/virtual/input/input12
U: Uniq=
H: Handlers=sysrq kbd mouse0 event11 
B: PROP=0
B: EV=7
B: KEY=70000 0 0 0 0 0 7ffff ffffffff fffffffe
B: REL=143

..这有点混乱。但正如您所看到的,它还会为您提供在 中创建的设备的快捷方式/dev/input

于 2016-02-16T16:57:49.420 回答
0

我处于没有UI_GET_SYSNAME为我工作的功能的船上(它执行了,但什么也没返回)。另外,我想要“事件处理程序路径”,它是一个不同的(尽管相关的)动态值。因此,我被迫解析/proc/bus/input/devices文件的丑陋。

我在以下 StackExchange 线程上发布了我的bash解析器: https ://unix.stackexchange.com/questions/82064/how-to-get-the-actual-keyboard-device-given-the-output-of-proc -总线输入设备/507209#507209

这将根据需要为您获取这些值中的任何一个......

于 2019-03-19T15:14:36.993 回答