类似于驱动程序的开发,注册/proc文件也需要初始化一个数据结构:
struct proc_dir_entry
然后调用static inline struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent) 函数注册proc文件,在卸载模块时,调用 remove_proc_entry(name, parent)宏,注销该proc文件即可。
具体步骤:
1. 声明一个proc_dir_entry结构
2. 调用create_proc_entry注册一个proc_dir_entry结构
3. 填写proc_dir_entry结构的几个关键字段,其中read函数是必填的
4. 注销该proc_dir_entry结构
一个简单的例子:
[code]
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
#include <asm/uaccess.h>
int my_read(char* page,char** start,off_t off,int count,int* eof,void* data)
{
int len=0;
char* head=page;
struct timeval time;
do_gettimeofday(&time);
len=sprintf(head,"sec: %d usec: %d/n",time.tv_sec,time.tv_usec);
page[len]='/0';
return len;
}
struct proc_dir_entry* proc_file=NULL;
int enter_module(void)
{
struct timeval time;
proc_file=create_proc_entry("clock",0664,NULL);
proc_file->read_proc=my_read;
proc_file->write_proc=NULL;
proc_file->owner=THIS_MODULE;
do_gettimeofday(&time);
printk("sec: %d usec: %d/n",time.tv_sec,time.tv_usec);
return 0;
}
void leave_module(void)
{
remove_proc_entry("clock",NULL);
printk("leave clock/n");
}
module_init(enter_module);
module_exit(leave_module);
[/code]
struct proc_dir_entry
然后调用static inline struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent) 函数注册proc文件,在卸载模块时,调用 remove_proc_entry(name, parent)宏,注销该proc文件即可。
具体步骤:
1. 声明一个proc_dir_entry结构
2. 调用create_proc_entry注册一个proc_dir_entry结构
3. 填写proc_dir_entry结构的几个关键字段,其中read函数是必填的
4. 注销该proc_dir_entry结构
一个简单的例子:
[code]
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>
#include <linux/sched.h>
#include <asm/uaccess.h>
int my_read(char* page,char** start,off_t off,int count,int* eof,void* data)
{
int len=0;
char* head=page;
struct timeval time;
do_gettimeofday(&time);
len=sprintf(head,"sec: %d usec: %d/n",time.tv_sec,time.tv_usec);
page[len]='/0';
return len;
}
struct proc_dir_entry* proc_file=NULL;
int enter_module(void)
{
struct timeval time;
proc_file=create_proc_entry("clock",0664,NULL);
proc_file->read_proc=my_read;
proc_file->write_proc=NULL;
proc_file->owner=THIS_MODULE;
do_gettimeofday(&time);
printk("sec: %d usec: %d/n",time.tv_sec,time.tv_usec);
return 0;
}
void leave_module(void)
{
remove_proc_entry("clock",NULL);
printk("leave clock/n");
}
module_init(enter_module);
module_exit(leave_module);
[/code]