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

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

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

我关注了both tutorials在这个非常好的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 后使用它(省略错误/完整性检查):

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 中创建的设备的快捷方式。

关于c - 如何获取 uinput 创建的设备的名称(路径),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34064047/

相关文章:

选择正确的号码

ruby - 使用 Chef 安装 rpm 包

c - void __iomem * 和 void* __iomem 之间的区别?

c - 为什么头文件包含完整的代码实现?

c - 获取该行的每个字符,然后对其进行加密

c - 如何让这个程序跳过 switch 函数,这样它就不会在较小的输入前面输出零)

c++ - 将 svg 转换为图像的库?

Linux/Unix 替换字符串中的模式并使用 sed 保存到新文件

javascript - 在 Linux CentOs 上运行 node.js 服务器

linux-kernel - 为什么 clock_nanosleep 在配置为休眠 10 毫秒时却休眠 20 毫秒?