我是内核编程的新手,我正在尝试用户和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,会发生什么。
答案 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