我正在学习内核模块编程的教程。之后我编写了一些编程来在读取或写入/ proc文件时执行某些过程。我成功编译了模块并执行了insmod。但是,当我试图读取像
这样的proc文件时cat / proc / procfile
它会抛出权限被拒绝错误。
我在我的代码中包含了模块权限功能,每次权限检查失败时都会发现这实际上会导致错误。
struct cred *proc_current; //to get the EUID for current task
static struct proc_dir_entry *our_proc_file;
static int module_permission(struct inode *inode, int op)
{
printk(KERN_INFO "permission is %d \n",op);
if(op==4||(op==2 && (proc_current->euid == 0)))
return 0;
return -EACCES;
}
.....
//Init module
static int __init proc_init(void)
{
printk(KERN_INFO "Init module loaded \n");
our_proc_file=create_proc_entry(PROC_NAME, 0644, NULL);
if(our_proc_file == NULL)
{
remove_proc_entry(PROC_NAME,proc_root);
printk(KERN_INFO "Error in creating proc file \n");
return -ENOMEM;
}
our_proc_file->proc_fops=&fops;
our_proc_file->proc_iops=&iops;
our_proc_file->mode=S_IFREG | S_IRUGO | S_IWUSR;
our_proc_file->uid=0;
our_proc_file->gid=0;
our_proc_file->size=80;
printk(KERN_INFO "proc file created in '/proc' \n");
return 0;
}
我尝试在init模块中将文件权限更改为777,但这对我没有帮助。 当我排除权限检查功能时,它可以工作。 还可以看一下权限函数,其中
printk(KERN_INFO "permission is %d \n",op);
始终打印36.这是什么原因以及如何在此处实际进行权限检查?
实际代码在这里 procfile.c
答案 0 :(得分:0)
/ proc下的大多数文件都是root用户,如果你试图以普通用户的身份阅读它们,你会得到你引用的结果。
答案 1 :(得分:0)
替换
our_proc_file->mode=S_IFREG | S_IRUGO | S_IWUSR;
使用
our_proc_file->mode = S_IRUGO | S_IWUGO | S_IXUGO;
参考:stat.h