我正在开发一个在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
答案 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
似乎自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));