proc编程(proc_create_data)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
proc_create_data函数:创建proc虚拟文件系统文件
函数原型:
static inline struct proc_dir_entry *proc_create_data(const char *name,
mode_tmode, struct proc_dir_entry *parent,
conststruct file_operations *proc_fops, void *data)
{
return NULL;
}
参数1:name为你要建立的文件
参数2:mode为建立的文件所拥有的读写等权限
参数3:parent为你要在哪个文件夹下建立名字为name的文件,如:init_net.proc_net是要在/proc/net/下建立文件
参数4:proc_fops为struct file_operations *指针
参数5:data保存似有数据的指针,如不要为NULL
test_main.c:
#include<linux/init.h>
#include<linux/module.h>
#include<linux/types.h>
#include<linux/slab.h>
#include<linux/fs.h>
#include<linux/proc_fs.h>
#include<linux/seq_file.h>
#include<net/net_namespace.h>
#include<linux/mm.h>
MODULE_LICENSE("GPL");
struct_DATA_INFO{
int data1;
int data2;
};
static struct_DATA_INFO data_info[2];
/* PROC stuff */
static void*dl_seq_start(struct seq_file*s,loff_t*pos)
{
static unsigned long counter=0;
if(*pos==0)
{
return&counter;
}
else
{
*pos=0;
return NULL;
}
}
static void*dl_seq_next(struct seq_file*s,void*v,loff_t*pos)
{
return NULL;
}
static void dl_seq_stop(struct seq_file*s,void*v)
{
}
static int dl_seq_show(struct seq_file*s,void*v)
{
struct proc_dir_entry*pde=s->private;
struct_DATA_INFO*info=pde->data;
seq_printf(s,"%d----%d",info->data1,info->data2);
return0;
}
static struct seq_operations dl_seq_ops={
.start=dl_seq_start,
.next=dl_seq_next,
.stop=dl_seq_stop,
.show=dl_seq_show
};
static int dl_proc_open(struct inode*inode,struct file*file)
{
int ret=seq_open(file,&dl_seq_ops);
if(!ret){
struct seq_file*sf=file->private_data;
sf->private=PDE(inode);
}
return ret;
}
static const struct file_operations dl_file_ops={
.owner=THIS_MODULE,
.open=dl_proc_open,
.read=seq_read,
.llseek=seq_lseek,
.release=seq_release
};
void init_mem(void)
{
data_info[0].inflow=1;
data_info[0].upflow=2;
proc_create_data("proc_test1",0,init_net.proc_net,&dl_file_ops ,&data_info[0]);
data_info[1].inflow=3;
data_info[1].upflow=4;
proc_create_data("proc_test2",0,init_net.proc_net,&dl_file_ops ,&data_info[1]);
}
static int__init init_mem_pool(void)
{
init_mem();
return0;
}
static void__exit exit_mem_pool(void)
{
remove_proc_entry("proc_test1",init_net.proc_net);
remove_proc_entry("proc_test2",init_net.proc_net);
}
module_init(init_mem_pool);
module_exit(exit_mem_pool);
Makefile:
TARGET=test_main
CURRENT=$(shell uname-r)
KDIR=/lib/modules/$(CURRENT)/build
PWD=$(shell pwd)
CF=*.o.*o.d.*.cmd.*.flags*.mod.c Module.*modules.*.tmp_*
obj-m:=$(TARGET).o
default:
make-C$(KDIR)SUBDIRS=$(PWD)modules
clean:
-rm-rf$(CF)
-include$(KDIR)/Rules.make
运行:insmod test_main.ko
cat/proc/net/proc_test1
cat/proc/net/proc_test2
可以看到不同的值。