|  | 
 
| [size=13.333333015441895px]test_main.c: [size=13.333333015441895px]运行:复制代码#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); 
    return 0; 
} 
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(); 
    return 0; 
} 
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
 | 
 |