如何获取 uinput 创建的设备的名称(路径)
How to get name (path) of uinput created device
我已经成功地设置了一个小程序来创建一个 uinput 设备,我打算用它来自动测试接收键盘输入事件的应用程序。
我关注了both tutorials as found in this very nice answer。
当我的程序通过调用 ioctl(fd, UI_DEV_CREATE)
创建 uinput 设备时,一个新设备出现在文件系统中,因此我的被测应用程序可以连接到它并等待事件。我的目标系统已经有一个 /dev/input/event0
设备,因此新设备获得路径 /dev/input/event1
。如果我编译并 运行 我的桌面系统的程序,那里有现有的设备 /dev/input/event[0-15]
,当程序是 运行 时,新设备得到 /dev/input/event16
.
我希望我的程序在创建新设备名称后报告它。有办法得到吗?
是的,您可以使用 UI_GET_SYSNAME
(在 /usr/include/linux/uinput.h
中定义),如果它在您的平台上可用(例如,Android,由于某种原因没有定义它)。它将为您在 /sys/devices/virtual/input
中创建的设备命名。了解 sysfs 中的设备后,您可以通过阅读 this SO question.
找出在 /dev/input
中创建的设备
像这样调用UI_DEV_CREATE
后使用它(省略error/sanity检查):
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);
如果不可用,您可以尝试在 /proc/bus/input/devices
中查找 sysfs 设备,其中应包含如下条目:
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
.
中创建的设备的快捷方式
我正处于没有 UI_GET_SYSNAME
函数为我工作的困境中(它执行了,但没有返回任何内容)。另外,我想要 "event handler path" 这是一个不同的(虽然相关)动态值。因此,我被迫解析 /proc/bus/input/devices
文件。
我在以下 StackExchange 线程上发布了我的 bash 解析器:https://unix.stackexchange.com/questions/82064/how-to-get-the-actual-keyboard-device-given-the-output-of-proc-bus-input-device/507209#507209
这将根据需要为您获取这些值中的任何一个...
我已经成功地设置了一个小程序来创建一个 uinput 设备,我打算用它来自动测试接收键盘输入事件的应用程序。
我关注了both tutorials as found in this very nice answer。
当我的程序通过调用 ioctl(fd, UI_DEV_CREATE)
创建 uinput 设备时,一个新设备出现在文件系统中,因此我的被测应用程序可以连接到它并等待事件。我的目标系统已经有一个 /dev/input/event0
设备,因此新设备获得路径 /dev/input/event1
。如果我编译并 运行 我的桌面系统的程序,那里有现有的设备 /dev/input/event[0-15]
,当程序是 运行 时,新设备得到 /dev/input/event16
.
我希望我的程序在创建新设备名称后报告它。有办法得到吗?
是的,您可以使用 UI_GET_SYSNAME
(在 /usr/include/linux/uinput.h
中定义),如果它在您的平台上可用(例如,Android,由于某种原因没有定义它)。它将为您在 /sys/devices/virtual/input
中创建的设备命名。了解 sysfs 中的设备后,您可以通过阅读 this SO question.
/dev/input
中创建的设备
像这样调用UI_DEV_CREATE
后使用它(省略error/sanity检查):
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);
如果不可用,您可以尝试在 /proc/bus/input/devices
中查找 sysfs 设备,其中应包含如下条目:
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
.
我正处于没有 UI_GET_SYSNAME
函数为我工作的困境中(它执行了,但没有返回任何内容)。另外,我想要 "event handler path" 这是一个不同的(虽然相关)动态值。因此,我被迫解析 /proc/bus/input/devices
文件。
我在以下 StackExchange 线程上发布了我的 bash 解析器:https://unix.stackexchange.com/questions/82064/how-to-get-the-actual-keyboard-device-given-the-output-of-proc-bus-input-device/507209#507209
这将根据需要为您获取这些值中的任何一个...