2014-01-07 54 views
2

我在学习内核模块编程的教程。之后,我编写了一些编程来在/ proc文件读取或写入时执行一些过程。我成功编译了模块并进行了insmod。但是,当过我尝试念想权限在读取proc文件时被拒绝错误

执行cat/proc/procfile

一个proc文件,则抛出权限被拒绝的错误。

我在我的代码中包含了模块权限函数,每当权限检查失败时我都会发现它实际上会引发错误。

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

请修复缩进。内核版本为? – alk

+0

? – ldx

+0

教程是基于2.6版本,我根据最近的版本更正了所有的语法 – Chandu

回答

0

大多数/ proc下的文件是根只,如果您尝试阅读它们,你会得到你举结果的普通用户。

+0

我尝试用root ly ...仍面临相同的错误.. – Chandu

0

更换
our_proc_file->mode=S_IFREG | S_IRUGO | S_IWUSR;

随着
our_proc_file->mode = S_IRUGO | S_IWUGO | S_IXUGO;

参考:stat.h