《Linux内核模块编程指南》中chardev.c示例的问题

3

我编译并运行了chardev.c示例,来自于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命令后,驱动程序按预期工作。

然而,有人说这样做是不正确的。

正确的操作方式是什么,为什么?


你能发布你的模块的完整源代码吗? - Tim Post
2个回答

5
您可以在drivers/watchdog/softdog.c中找到一份非常简单明了的示例,该示例显示了以下操作:
  • 从设备读取
  • 向设备写入
  • 通过设备展示ioctl接口
虽然softdog是一个非常有用的工具,但它更像是一个教程。Alan Cox把它拼凑起来了,所以它是更"正确"实现的很好的例子。
如果您可以发布模块的完整源代码,我们可以帮助您找出为什么函数不按预期进入的原因。
更新:
允许不受特权的用户写入字符设备是完全可行的!我再次强调,允许不受特权的用户写入字符设备是完全可行的!如果不是这样的话,例如FUSE、Modems、USB小玩意儿、CD ROMS和其他东西将需要root访问才能使用。
您可以利用组成员身份。即,在Ubuntu上,允许使用FUSE(用户空间文件系统)的用户应该属于'fuse'组,这允许精细控制谁可以使用该功能,谁不能使用该功能。同样,在我的某些系统上,正在使用QRNG(量子随机数发生器)...并且是(你猜对了)字符设备。我需要允许PHP访问该设备,所以我:
  • 创建一个QRNG组
  • 确保PHP作为用户运行(而不是匿名系统用户)
  • 将拥有需要访问设备的应用程序的用户添加到QRNG组中
希望这能解决您的问题 :)

源代码位于链接页面底部:http://tldp.org/LDP/lkmpg/2.6/html/x569.html - Robert S. Barnes
软狗(softdog)的作用是什么?它会在一定时间后导致系统重新启动吗? - Robert S. Barnes
1
@Robert S Barnes:一旦看门狗设备被打开,您将需要每隔(xx)分钟写入数据,否则系统将会重新启动。您也可以向其中写入一个神秘的键“W”,使得看门狗停止监控。 - Tim Post

4

我认为,实际问题是您发出的写入命令不正确。请尝试以下命令:

#sudo sh -c "echo "hi" > /dev/chardev"

如果您想要使用sudo运行多个命令,则应该按照上面所示的方式执行命令。这样,您就无需进行chmod和更改其权限。希望这可以帮到您。


1
不,这不仅仅是“echo”,还有一个运行shell来重定向echo输出的过程。使用您的命令,/bin/echo程序正在以root身份运行,因为使用了sudo,但是将echo输出重定向到仅限root访问的文件的shell仍在作为您的身份运行。在sudo启动之前,您当前的shell执行重定向操作。 解决方案是在sudo下运行整个管道。 - Vinit Dhatrak
@vinit:关于你下面的回答,为什么这些设备只能被root访问?难道没有一些情况下我可能希望任何人都可以写入设备吗? - Robert S. Barnes
出于安全考虑,请参考我在其他答案中的评论以获取进一步解释。 - Vinit Dhatrak
1
一个需要打开/dev/foo、获取FD并执行ioctl()的用户空间应用程序如何使用sudo呢?或者,有人希望使用minicom访问连接到串行端口的设备吗? - Tim Post
@vinit +1:虽然这不是我要找的答案,但这仍然是一个非常有用的小技巧。谢谢! - Robert S. Barnes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接