我从the chardev.c编译并运行了the lkmpg示例,当写入设备时收到意外错误:
anon@anon:~/lkmpg$ sudo echo "hi" > /dev/chardev
bash: /dev/chardev: Permission denied
模块写入功能如下所示:
/*
* Called when a process writes to dev file: echo "hi" > /dev/chardev
*/
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
printk(KERN_ALERT "Sorry, this operation isn't supported.\n");
return -EINVAL;
}
我没有收到无效操作的预期错误,并且错误打印到/ var / log / messages。
我可以毫无问题地从设备上读取,收到预期的结果:
anon@anon:~/lkmpg$ cat /dev/chardev
I already told you 6 times Hello world!
使用以下命令手动创建设备/ dev / chardev:
sudo mknod /dev/chardev c 252 0
这是什么交易?
- 编辑 -
显然,当我mknod创建设备时,它最终会获得以下权限:
crw-r--r-- 1 root root 252, 0 2009-10-30 09:27 /dev/chardev.
我做sudo chmod a+w /dev/chardev
后,驱动程序按预期工作。
然而,人们说这样做是不正确的。
什么是正确的行动方案?为什么?
答案 0 :(得分:5)
在drivers/watchdog/softdog.c
您可以将您的代码与此示例进行比较,该示例向您展示了如何执行以下操作:
虽然softdog是一个非常有用的工具,但它的教程与其他任何东西一样多。艾伦考克斯把它放在一起,所以它是更“正确”实施的一个很好的例子。
如果您可以将整个来源发布到您的模块,我们可以帮助您找出未按预期输入功能的原因。
<强> 更新 强>
完全可以允许特权用户在字符设备上写字!我再说一遍,允许特权用户写入角色设备完全可以接受!如果不是这种情况,FUSE,调制解调器,USB小工具,CD ROM和其他东西都需要root权限才能使用。
您可以做的是利用群组会员资格。即,在Ubuntu上,允许使用FUSE(用户空间中的文件系统)的用户应属于“fuse”组,这允许对谁能够和不能使用该功能进行细粒度访问。同样,在我的一些系统中,QRNG(量子随机数发生器)正在使用中......并且(你猜对了)一个字符设备。我需要允许PHP访问该设备,所以我:
我希望能够清除它:)
答案 1 :(得分:4)
我认为,实际问题是您发出的写入命令不正确。试试
#sudo sh -c "echo "hi" > /dev/chardev"
如果要使用sudo运行多个命令,则应使用如上所示的命令。有了这个,你不需要做chmod并改变它的权限。希望这可以帮助。