4

我正在开发一个在 linux 上创建虚拟操纵杆的小程序,带有 python 前端。它是Linux-Virtual-Joystick的一个分支。

我需要写入 dev/uinput 以创建用户定义的操纵杆。该文件使用 O_RDWR 打开(我在调试时临时添加了其他文件的读/写访问权限)。当我做

write(uifd, &uidev, sizeof(uinput_user_dev));

它返回 -1 并将 errno 设置为 22(EINVAL)。参数正确,文件已成功打开。

有没有其他人遇到过这个问题?我将这个项目搁置了大约一个月,但我记得它在 Ubuntu 的最新版本中工作。

更新: uinput 适用于 ubuntu 12.10

4

3 回答 3

8

我认为您遇到的问题是访问权限uinput。您收到的错误消息是典型的,我之前在其他设备上看到过相同的行为。

为了测试该假设,更改/dev/uinput权限以允许访问所有人:

chmod +0666 /dev/uinput

然后再试一次你的代码。如果现在它工作正常,您将需要将该更改永久化,否则它将在重新启动后恢复为原始权限。

要以安全的方式执行此操作,请添加一个位于以下位置的规则文件:/etc/dev/rules.d

使用以下行:

KERNEL=="uinput", GROUP="udev_group"

要查看规则文件的外观,请检查位于以下位置的 udev 规则文件:

/lib/udev/rules.d/50-udev-default.rules

准备就绪后,添加一个名为 udev_group 的组并将您的用户名添加到其中(或任何应该具有写入权限的用户uinput)。

您可能需要重新启动才能使新规则生效。

结果将是该组成员的任何用户都将拥有对 的完全访问权限uinput,这正是您想要的。


要添加组,您可以安装“用户和组”:

sudo apt-get install gnome-system-tools

并在以下位置启动它:

Application -> System Tools -> Administration -> Users and Groups**

或在终端:

gnome-system-tools
于 2012-08-13T18:52:17.460 回答
0

我在 Ubuntu 14.04 中也遇到了这个错误,来自你的仓库(https://github.com/ferry-/Linux-Virtual-Joystick-cpp)。我通过将 device.h 中设备构造函数中的 device::uidev 成员清零来修复它。

memset(&uidev, 0, sizeof(uidev));

于 2014-07-23T23:18:50.443 回答
0

由于缺少 uinput 模块,您应该考虑在继续之前构建它。

我从来没有用这种方式重建过 Linux 内核模块,所以你可以按照这里的解释

首先,您需要获取相应的 Linux 源代码和头文件。同时安装module-init-tools
然后,将 dir 更改为 /usr/src/linux 并以 root 身份执行

cp /boot/config-* ./.config
make drivers/input/misc/uinput.ko

构建 uinput.ko 需要几分钟

在将 uinput.ko 移动到 /lib/modules/<"yourkernelversion">/kernel/drivers/input/misc 之前检查它是否有效

insmod ./drivers/input/misc/uinput.ko

编辑1:

似乎从 Linux 2.6.35-17.23 开始,uinput 是一个内置模块。这就是lsmod 不显示它的原因。

我刚刚看了你的代码,我认为问题出在这一行

if (write(uifd, &uidev, sizeof(uinput_user_dev) != sizeof(uinput_user_dev))) 

它应该是

if (write(uifd, &uidev, sizeof(uinput_user_dev)) != sizeof(uinput_user_dev))

希望有帮助

于 2012-08-13T23:24:19.187 回答