如何以编程方式设置我的char设备的权限

时间:2012-08-07 12:59:44

标签: c permissions linux-device-driver

我最近在工作中继承了一些代码,这是旧的2.4.X linux内核驱动程序,我的任务是让他们使用更新的内核2.6或更高版本。我正在运行带有3.1.10内核的OpenSUSE 12.1。

我已经从register_chrdev()更新原始代码以使用class_create()/ device_create()调用,我可以看到我的设备正确显示在/ dev中。我目前的问题是我的设备的权限仅为用户设置为r / w:

crw-------  1 root root    244,   0 Aug  7 07:57 gcanain

我知道我可以通过命令行“chmod”该文件,或者我可以设置udev权限......但无论如何都要以编程方式执行此操作,这样当我发出insmod命令时,dev将被挂载已经有正确的规则吗?

我是否可以调用任何API来执行此操作,我在其中一个创建API中缺少任何选项?

为了澄清,我不想使用udev规则的部分原因是我不知道设备驱动程序的名称。设备驱动程序是在循环中生成的,因此名称后面附有数字,nNumDevs几乎可以是任何东西:

for (i = 0; i < nNumDevs; i++) {
  strcpy(Modname,GC_ANAIN_MODULE_NAME);
  strcat(Modname,"%d");
  device_create(c1, NULL, MKDEV(nMajor, GC_ANAIN_MINOR_VERSION+i), NULL, Modname, i);
}

3 个答案:

答案 0 :(得分:6)

这是使用by the TTY driver在创建时设置0666权限的方法:

{React.createElement(brandingConfig.svgs.Add)}

struct class中的devnode属性有一个参数指针static char *tty_devnode(struct device *dev, umode_t *mode) { if (!mode) return NULL; if (dev->devt == MKDEV(TTYAUX_MAJOR, 0) || dev->devt == MKDEV(TTYAUX_MAJOR, 2)) *mode = 0666; return NULL; } static int __init tty_class_init(void) { tty_class = class_create(THIS_MODULE, "tty"); if (IS_ERR(tty_class)) return PTR_ERR(tty_class); tty_class->devnode = tty_devnode; return 0; } ,允许您设置权限。

请注意,当设备被销毁时,mode可能是mode

答案 1 :(得分:3)

试试这个: #include <sys/stat.h>

int chmod(const char *path, mode_t mode); 要么 int fchmod(int fd, mode_t mode);

来源:man -s 2 chmod

答案 2 :(得分:1)

udev有权限规则,您需要在/etc/udev/rules.d

下创建权限

首先尝试这个:

在文件/etc/udev/udev.conf中,添加以下行:

# My default permissions
default_mode="0660"

如果这不起作用,请在/etc/udev/rules.d中添加规则,详情请点击此处:http://www.reactivated.net/writing_udev_rules.html