3.10.17 procfs示例


/*
 *    wesley
 *    the linux module sample of procfs
 *    
 *    wesley for testing
 *    2013-12-23 14:50:14
 
 *    insmod sampleproc.ko     加载模块
 *    rmmod sampleproc             卸载模块

 *    dmesg 来查看显示内容
 *    lsmod 显示加载模块
 
 http://blog.chinaunix.net/uid-23390992-id-3026872.html
 http://blog.chinaunix.net/uid-24432676-id-2607766.html
 
*/

#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("XJLI/GPL");

struct proc_data_t{
    int a;
    int b;
} ;


struct _DATA_INFO{
    int data1;
    int data2;
};
static struct _DATA_INFO data_info[2];


static void *sampleproc_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 *sampleproc_seq_next(struct seq_file *s, void *v, loff_t *pos)
{
    return NULL;
}
static void sampleproc_seq_stop(struct seq_file *s, void *v)
{
}

static int sampleproc_seq_show(struct seq_file *s, void *v)
{
    struct inode *i = s->private;
    struct _DATA_INFO *info = PDE_DATA(i);
    
    seq_printf(s, "%d----%d", info->data1, info->data2);
    
    return 0;
}

struct proc_data_t data;

static struct seq_operations sampleproc_seq_ops = {
    .start = sampleproc_seq_start,
    .next = sampleproc_seq_next,
    .stop = sampleproc_seq_stop,
    .show = sampleproc_seq_show
};

static int sampleproc_proc_open(struct inode *inode, struct file *file)
{
    int ret = seq_open(file, &sampleproc_seq_ops);
    if (!ret) {
        struct seq_file *sf = file->private_data;
        sf->private = inode;
    }
    
    return ret;
}

static const struct file_operations sampleproc_file_ops = {
    .owner   = THIS_MODULE,
    .open    = sampleproc_proc_open,
    .read    = seq_read,
    .llseek  = seq_lseek,
    .release = seq_release,
};

static int sampleproc_init(void)
{
    //struct proc_dir_entry *proc;
    
    data.a = 10;
    data.b = 20;
    
    printk(KERN_INFO "sampleproc_init");
    
    data_info[0].data1=1;
    data_info[0].data2=2;
    proc_create_data("proc_test1", 0, NULL, &sampleproc_file_ops, &data_info[0]);
    data_info[1].data1=3;
    data_info[1].data2=4;
    proc_create_data("proc_test2", 0, NULL, &sampleproc_file_ops, &data_info[1]);
    
    
    /*第三个参数设置为NULL,默认在/proc/下建立名字为test_proc的文件*/
    //proc = proc_create("sampleproc", 0, NULL, &sampleproc_file_ops);
    //if (!proc)
    //    goto -1;
    
    return 0;
}

static void sampleproc_exit(void)
{
    printk(KERN_INFO "sampleproc_exit");

    remove_proc_entry("proc_test1", NULL);
    remove_proc_entry("proc_test2", NULL);
}

module_init(sampleproc_init);
module_exit(sampleproc_exit);

转载于:https://www.cnblogs.com/mull/p/4477796.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值