错误提示:"passing argument 4 of ‘proc_create’ from incompatiable pointer type"如下图
可以看到提示参数不匹配,通过打开proc_fs.h文件可以看到有这个函数的定义,见下图。
可以看到,第四个参数定义为const struct proc_ops *proc_ops,而非参考代码中的const struct file_operations *proc_fops。因而需要对proc_ops结构体进行修改,通过查阅proc_ops结构体的定义,见下图
可以看到只需对其中的成员proc_read赋值为read_proc即可。
参考代码如下:
#include <linux/module.h> #include <linux/kernel.h> #include<linux/sched.h> #include <asm/uaccess.h> #include <linux/proc_fs.h> static struct proc_dir_entry *proc_parent; int len,temp; char *msg; static ssize_t read_proc(struct file *filp,char __user *buf,size_t count,loff_t *offp ) { int a; //used to recept the value return from the function if(count>temp) count=temp; temp=temp-count; a=raw_copy_to_user(buf,msg, count); if(count==0) temp=len; return count; } static struct proc_ops proc_fops={ .proc_read = read_proc }; void create_new_proc_entry(void) { /*create a new directory named hello, and return a pointer point to this dir*/ proc_parent = proc_mkdir("hello",NULL); if(!proc_parent) { printk(KERN_INFO "Error creating proc entry"); } /*create a file named world, add read attribute to this file using proc_fops*/ proc_create("world",0,proc_parent,&proc_fops); msg="hello world\n"; /*file content*/ len=strlen(msg); temp=len; printk(KERN_INFO "1.len=%d",len); printk(KERN_INFO "proc initialized"); } static int __init proc_init(void) { create_new_proc_entry(); return 0; } static void __exit proc_cleanup(void) { printk(KERN_INFO " Inside cleanup_module\n"); remove_proc_entry("hello",proc_parent); remove_proc_entry("world",NULL); } MODULE_LICENSE("GPL"); module_init(proc_init); module_exit(proc_cleanup);