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

Mik*_*ike 7 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
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过命令行"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);
}
Run Code Online (Sandbox Code Playgroud)

小智 8

这是TTY驱动程序在创建时将权限设置为0666的方法:

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;
}
Run Code Online (Sandbox Code Playgroud)

devnode属性struct class有一个参数指针mode,允许您设置权限.

当心,mode可能是NULL设备被破坏的时候.


ask*_*ish 4

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

int chmod(const char *path, mode_t mode); 或者 int fchmod(int fd, mode_t mode);

来源: man -s 2 chmod