写入/ dev / uinput(在Ubuntu 12.04上)

我正在开发一个在linux上创build虚拟游戏杆的小程序,用python前端。 这是Linux-Virtual-Joystick的一个分支。

我需要写入dev / uinput才能创build用户定义的游戏杆。 该文件是用O_RDWR打开的(我在debugging时暂时添加了对文件的读/写访问)。 当我做

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

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

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

更新: uinput在Ubuntu 12.10的作品

我认为你的问题是有输入权限。 您收到的错误消息是典型的,我已经看到与其他设备相同的行为。

为了测试该假设,请更改/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 

希望有所帮助!

由于缺少输入模块,因此在继续之前应考虑进行构建。

我从来没有这样重建过一个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)) 

希望有所帮助

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

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