为什么proc_create模式参数0对应于0444

时间:2015-02-22 21:19:25

标签: linux permissions kernel procfs

我是内核编程的新手,我正在尝试用户和procfs。我用谷歌搜索了几个例子,他们都使用:

 proc_create("hello",0,NULL,&proc_fops);

其中第二个参数是文件模式/权限。每proc_fs.h:

static inline struct proc_dir_entry *proc_create(
         const char *name, umode_t mode, struct proc_dir_entry *parent,
         const struct file_operations *proc_fops)

模式是umode_t类型,据我所知,它被解析为unsigned short int。

在至少3个例子中,随附的评论和措辞表明基本相同的事情,即"您看到的值为零表示您在proc文件上需要的权限,其中零表示文件权限的默认值0444.换句话说,您可能刚刚使用了数字值0444(对于八进制),或者0400表示限制性更强的访问,等等。但是对于典型的可读proc文件使用零是相当正常的。"

我无法理解这意味着什么。我理解文件权限,chmod u + x,八进制数,我想我理解umask。

我只是不清楚0如何映射到0444,如果我把1放在那里而不是0,会发生什么。

1 个答案:

答案 0 :(得分:1)

答案似乎只是进一步。 include / linux / proc_fs.h 说:

static inline struct proc_dir_entry *proc_create(
        const char *name, umode_t mode, struct proc_dir_entry *parent,
        const struct file_operations *proc_fops)
{
           return proc_create_data(name, mode, parent, proc_fops, NULL);
}

proc_create_data fs / proc / generic.c 中定义。它就是:

struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
                    struct proc_dir_entry *parent,
                    const struct file_operations *proc_fops,
                    void *data)
{
    ...

    if ((mode & S_IALLUGO) == 0)
        mode |= S_IRUGO;

    ...
}

如果模式阻止所有人做任何事情,请将模式设置为00444。

对于completness,来自 include / linux / stat.h

#define S_IRWXUGO   (S_IRWXU|S_IRWXG|S_IRWXO)
#define S_IALLUGO   (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
#define S_IRUGO     (S_IRUSR|S_IRGRP|S_IROTH)

include / uapi / linux / stat.h

#define S_ISUID  0004000
#define S_ISGID  0002000
#define S_ISVTX  0001000

#define S_IRWXU 00700
#define S_IRUSR 00400

#define S_IRWXG 00070
#define S_IRGRP 00040

#define S_IRWXO 00007
#define S_IROTH 00004