我正在开发一个在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
看来,从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));