如何获取uinput创建的设备的名称(路径)

时间:2015-12-03 10:51:55

标签: c linux linux-kernel linux-device-driver uinput

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

我已按照both tutorials跟踪了answer这个非常好的getline()

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

我希望我的程序在创建后报告新设备名称。有办法搞定吗?

2 个答案:

答案 0 :(得分:6)

是的,您可以使用UI_GET_SYSNAME(在/usr/include/linux/uinput.h中定义),如果它在您的平台上可用(例如Android,由于某种原因没有定义它)。它将为您在/sys/devices/virtual/input中创建的设备命名。在 sysfs 中了解设备后,您可以通过阅读this SO question找出在/dev/input中创建的设备。

在调用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);

如果它不可用,您可以尝试查找/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中创建的设备的快捷方式。

答案 1 :(得分:0)

I was in the boat of not having the UI_GET_SYSNAME function work for me (it executed, but returned nothing). Also, I wanted the "event handler path" which is a different (though related) dynamic value. As such, I forced into the ugliness of parsing the /proc/bus/input/devices file.

I posted my bash parser for this on the following StackExchange thread: https://unix.stackexchange.com/questions/82064/how-to-get-the-actual-keyboard-device-given-the-output-of-proc-bus-input-device/507209#507209

That will fetch either of these values for you on demand...