Errno:13关于在proc条目上使用fopen

时间:2012-02-13 19:10:29

标签: c file-io kernel-module errno

我正在尝试编写由可加载内核模块创建的/ proc文件。我正在使用fopen()来打开文件进行写入但是我得到了错误:13(权限被拒绝)。

FILE *fp;
fp = fopen("/proc/file1","w");
if(fp == NULL){
     printf("Errno : %d",errno); // prints 13
}

The LKM contains the following code:

static struct proc_dir_entry *proc_entry;

static ssize_t proc_write(struct file *filp, const char __user *buff, unsigned long len, void *data)
{  
    // code writes from buffer to local variable

    return len;
}

static ssize_t proc_read(char *page, char **start, off_t off, int count, int *eof, void *data)
{
    // code for reading file

    return 0;
}


int proc_open(struct inode *inode, struct file *file)
{
    try_module_get(THIS_MODULE);
    return 0;
}

int proc_close(struct inode *inode, struct file *file)
{
    module_put(THIS_MODULE);
    return 0;
}

有关如何克服这个问题的任何建议吗?

感谢。

1 个答案:

答案 0 :(得分:2)

最可能的答案是创建的procfs节点没有对用户的正确权限。

以root身份运行时,它会绕过节点的大多数权限检查,因此您不会收到错误(有例外;这是一般情况)。

在内核可加载模块中,它创建procfs节点(在.c文件中的某个位置):

create_proc_entry(...)

你需要确保第二个参数,模式被设置为允许root以外的用户打开写入的东西,以支持你想要的打开选项;例如0666使任何人都可以将文件全局打开为R / W.

通常,procfs中的节点使用标志0444创建(即仅适用于所有用户的R / O)。有些是以0644模式创建的(R / W是root用户,R / O是所有其他用户),有些是使用权限0400创建的(R / O用于root,其他所有用户都远离)。 / p>