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

时间:2012-08-13 17:25:55

标签: linux input ubuntu-12.04

我正在开发一个在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

3 个答案:

答案 0 :(得分:4)

我认为您遇到的问题是对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

希望有所帮助!

答案 1 :(得分:0)

由于缺少uinput模块,因此在进一步研究之前应考虑构建它。

我从未以这种方式重建Linux内核模块,因此您可以按照here

的说明进行操作

首先,您需要获取相应的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 is a built-in module。这就是为什么it's not shown by 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))

希望有所帮助

答案 2 :(得分:0)

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

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