【问题标题】:How can I programmatically set permissions on my char device如何以编程方式在我的 char 设备上设置权限
【发布时间】:2012-08-04 12:07:17
【问题描述】:

我最近在工作中继承了一些代码,这是旧的 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);
}

【问题讨论】:

  • 我认为你应该继续使用udev。设备权限通常是本地管理员的权限,他们可能对访问有与设备驱动程序作者不同的想法。您可以在/etc/udev/rules.d 或其他内容中删除默认设置。
  • 明白,但我们(我的小组)是系统的管理员,所以如果我希望所有东西都有 777,我可以这样做。此外,我在使用 rules.d(在原始描述中更新)时遇到问题,因为设备驱动程序的名称是动态创建的……除非我误解了如何使用 udev。
  • @Mike:但 udev 规则可以使用通配符来匹配设备名称 (KERNEL=="foo*"),也可以匹配驱动程序名称 (DRIVERS=="bar")。
  • @Mike 你解决了这个问题吗?我需要为 android 内核做同样的事情吗?
  • 你能接受答案吗?

标签: c permissions linux-device-driver


【解决方案1】:

这是使用by the TTY driver在创建时将权限设置为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;
}

struct class 中的 devnode 属性有一个参数指针 mode,可以让您设置权限。

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

【讨论】:

  • 我们需要注意什么?如果设备被破坏,我们就不再关心它了,对吧?
【解决方案2】:

试试这个: #include &lt;sys/stat.h&gt;

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

来源:man -s 2 chmod

【讨论】:

    【解决方案3】:

    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

    【讨论】:

      猜你喜欢
      • 2016-02-22
      • 1970-01-01
      • 2013-01-11
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 2011-12-19
      相关资源
      最近更新 更多