我正在尝试编写由可加载内核模块创建的/ 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;
}
有关如何克服这个问题的任何建议吗?
感谢。
答案 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>