0

我正在尝试编写由可加载内核模块创建的 /proc 文件。我正在使用 fopen() 打开文件进行写入,但得到 errno : 13 (permission denied)。

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;
}

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

谢谢。

4

1 回答 1

2

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

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

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

create_proc_entry(...)

您需要确保第二个参数 mode 设置为允许由 root 以外的用户打开以进行写入,以支持您所需的打开选项;例如0666,使文件可以被任何人以 R/W 的形式全局打开。

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

于 2012-02-13T20:29:12.977 回答