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

Linux 正在写入/dev/uinput(在ubuntu 12.04上),linux,input,ubuntu-12.04,Linux,Input,Ubuntu 12.04,我正在开发一个小程序,用python前端在linux上创建虚拟操纵杆。这是一把叉子 我需要写入dev/uinput以创建用户定义的操纵杆。 文件是用O_RDWR打开的(我在调试时临时为文件添加了读/写访问权限)。当我这样做的时候 write(uifd, &uidev, sizeof(uinput_user_dev)); 它返回-1并将errno设置为22(EINVAL)。参数正确,文件已成功打开 还有其他人遇到过这个问题吗?我把这个项目搁置了大约一个月,但我记得它在Ubuntu的最后一

我正在开发一个小程序,用python前端在linux上创建虚拟操纵杆。这是一把叉子

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

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

还有其他人遇到过这个问题吗?我把这个项目搁置了大约一个月,但我记得它在Ubuntu的最后一个版本中起了作用


更新:uinput在ubuntu 12.10上运行

我想你的问题是对
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
,这正是您想要的


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

并于以下地点推出:

Application -> System Tools -> Administration -> Users and Groups**
或在终端:

gnome-system-tools

由于UPoT模块丢失,您应该考虑在继续之前建立它。

我从未以这种方式重新构建过Linux内核模块,因此您可以按照下面的解释进行操作

首先,您需要获得相应的Linux源代码和头文件。同时安装模块初始化工具
然后,将dir更改为/usr/src/linux并以root用户身份执行

cp /boot/config-* ./.config
make drivers/input/misc/uinput.ko
构建uinput.ko需要几分钟的时间

在将uinput.ko移动到/lib/modules//kernel/drivers/input/misc之前检查它是否工作

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

编辑1: 似乎从Linux2.6.35-17.23开始。这就是为什么

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

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中也遇到了这个错误,来自您的repo()。我通过将device.h中的device构造函数中的device::uidev成员归零来修复它


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

您好,是否加载了uinput模块?/dev/uinput存在于我的系统(Lubuntu 11.10)中,但我无法加载uinput模块uHh。。我该怎么做?模块,如在共享库中一样?在终端中键入lsmod以查看所有加载的模块(可加载的内核模块)modprobe uinput&&lsmod | grep uinput不提供任何信息感谢您的回复。问题是,我以超级用户的身份尝试了该程序,然后将o+rw添加到/dev/uinput,以普通用户的身份运行它,并在eclipse中连接到gdb。不管怎样,它都在同一点失败了。我认为这不是权限问题。我们是否可以将chmod命令也添加到rule.d文件中?。这是因为最终用户可能不知道为/dev/uinputAutomatic access为登录用户设置所需的访问权限:添加文件
/etc/udev/rules.d/50 uinput.rules
,内容为:
KERNEL==“uinput”,TAG+=“uaccess”
,这真是让人扫兴。我希望能创造出一个非常有用的玩具,可以开箱即用。(应该是编辑)你确定uinput不存在吗?lsmod不显示uinput,但modprobe uinput不返回任何内容,因此它存在,但处于非活动状态。我将尝试添加/etc/modules,看看重启后会发生什么。谢谢你的回复好的。。。不是现在。看起来uinput实际上已加载:/I我将编辑我的答案
if (write(uifd, &uidev, sizeof(uinput_user_dev)) != sizeof(uinput_user_dev))