proc文件的实现也需要编写出一个内核模块并插入内核。模块的编写过程我们已经Hello,Module过了,而proc文件的实现稍微复杂一些。
在linux内核模块编写中,常常会有一些结构体,结构体中定义了很多函数指针,内核模块的编写常常是围绕着实现这些函数指针而进行的。实现了这些接口便可以调用相应的函数把相应的功能模块插入内核(拗口),以下是proc文件的结构体接口描述:
//linux/proc_fs.h
//读函数原型
typedef int (read_proc_t)(char *page, char **start, off_t off,
int count, int *eof, void *data);
//写函数原型
typedef int (write_proc_t)(struct file *file, const char __user *buffer,
unsigned long count, void *data);
struct proc_dir_entry {
unsigned int low_ino;
unsigned short namelen;
const char *name; //proc文件的名字
mode_t mode;
nlink_t nlink;
uid_t uid;
gid_t gid;
unsigned long size;
struct inode_operations * proc_iops;
struct file_operations * proc_fops;
get_info_t *get_info;
struct module *owner;
struct proc_dir_entry *next, *parent, *subdir;
void *data;
read_proc_t *read_proc; //读函数(需用户实现)
write_proc_t *write_proc; //写函数(需用户实现)
atomic_t count; /* use count */
int deleted; /* delete flag */
};
/*创建一个proc结构体
@name: proc文件的名字
@mode:
@parent: proc文件被创建的目录
*/
struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode,struct proc_dir_entry *parent);
/*
从内核中移除一个proc文件
*/
void remove_proc_entry(const char *name, struct proc_dir_entry *parent) ;