我正在做一个小型的linux模块,它是一个字符设备的驱动程序。 在我的代码中,我创build了设备类,而不是它自己的设备,因此在我的系统中创build了一个/ dev文件。 问题是/ dev文件只有root权限,用户既没有读,也没有写或执行该文件的权限,我想改变/ dev文件的权限。
我已经search了networking上的答案,我发现是改变了udev文件,但是这个解决scheme在我的情况下是行不通的,因为我需要权限来dynamic地改变模块加载到内核的时间。 我正在写的模块不会总是在我的机器上运行,因此我需要它来“更改”权限。
major_number_firewall = register_chrdev(0, device_name_firewall, &my_file_implementation_firewall); device_class = class_create(THIS_MODULE, class_name_firewall); log_file_device = device_create(device_class, NULL, MKDEV(major_number_firewall, MINOR_LOG), NULL, device_name_log_file);
有没有更改权限的function?
你可以写一个小的udev规则来实现这一点。
如果你正在实现一个字符设备驱动程序,那么可以考虑使用misc_register()
和misc_unregister()
来覆盖上面的调用( device_create()
…)。 参考struct miscdevice
struct miscdevice { int minor; const char *name; const struct file_operations *fops; struct list_head list; struct device *parent; struct device *this_device; const char *nodename; umode_t mode; };
您可以使用成员(struct miscdevice *)->mode
来设置适当的权限(S_IRUGO | S_IRWXUGO | S_IALLUGO | etc …)
希望这可以帮助。
我认为Rocoder的意思是首先改变设备文件的权限
int chmod(const char * path,mode_t mode); OR int fchmod(int fd,mode_t mode);
在你的用户空间应用程序。 然后用open()打开设备文件并做任何事情。
还要注意:我们的程序chmod本身不能超级用户模式。 这是为了确保没有非法程序占用系统。
你可以试试这个
#include <sys/stat.h>
int chmod(const char *path, mode_t mode);
OR int fchmod(int fd, mode_t mode);
或者在/etc/udev/udev.conf,
里面/etc/udev/udev.conf,
你可以修改default_mode = "0660"
要设置您的其他设备的权限,您可以按如下方式使用模式字段。
static struct miscdevice somedevice = { .minor = MISC_DYNAMIC_MINOR, .name = DEVICE_NAME, .fops = &some_fops, .mode = 0666, };
这将设置读/写访问所有。 要执行读/写操作,您不需要是root用户。
希望这可以帮助。