简单的procfs模型

#include <linux/module.h>

#include <linux/init.h>

#include <linux/kernel.h>

#include <linux/proc_fs.h>

#include <asm/uaccess.h>

static struct proc_dir_entry *root, *jiffies_file, *kbuf_file, *symlink,

*symlink;

//struct fb_data_t foo_data,bar_data;

static ssize_t proc_jiffies_read(struct file * file, char __user * buf,

size_t size, loff_t * offset)

{

if (*offset != 0)

return 0;

*offset += sprintf(buf, "jiffies=%ld\n", jiffies);

return *offset;

}

static int proc_jiffies_open(struct inode * inode, struct file * file)

{

file->private_data = inode->i_private;

return 0;

}

static struct file_operations jiffies_fops =

{ .owner = THIS_MODULE, .open = proc_jiffies_open, .read = proc_jiffies_read, };

static int kbuf_open(struct inode * inode, struct file * file)

{

file->private_data = inode->i_private;

return 0;

}

static char kbuf[128] =

{ 0 };

static ssize_t kbuf_read(struct file * file, char __user * buf, size_t size,

loff_t * offset)

{

if (*offset > 128)

{

return 0;

}

if (*offset + size > 128)

{

size = 128 - *offset;

}

copy_to_user(buf, kbuf + *offset, size);

*offset += size;

return size;

}

static ssize_t kbuf_write(struct file * file, char __user * buf, size_t size,

loff_t * offset)

{

if (*offset > 128)

{

return 0;

}

if (*offset + size > 128)

{

size = 128 - *offset;

}

copy_from_user(kbuf + *offset, buf, size);

*offset += size;

return size;

}

static struct file_operations kbuf_fops =

{ .owner = THIS_MODULE, .open = kbuf_open, .read = kbuf_read, .write =

kbuf_write, };

static int __init porcfs_init(void)

{

printk("###dragon### %s\n",__FUNCTION__);

int ret = 0;

/*在/proc下创建一个根目录*/

root = proc_mkdir("dragon",NULL);

if(root == NULL)

{

ret = -ENOMEM;

goto out;

}

/*创建读取jiffies的proc文件*/

jiffies_file = proc_create("jiffies", 0444, root, &jiffies_fops);

if(jiffies_file==NULL)

{

ret = -ENOMEM;

goto out;

}

kbuf_file = proc_create("kbuf", 0444, root, &kbuf_fops);

if(kbuf_file==NULL)

{

ret = -ENOMEM;

goto out;

}

symlink = proc_symlink("jiffies2",root,"jiffies");

if(symlink == NULL)

{

ret = -ENOMEM;

goto out;

}

return ret;

out:

proc_remove(root);

return ret;

}

static void procfs_exit(void)

{

printk("###dragon###\n", __FUNCTION__);

proc_remove(root);

return;

}

module_init(porcfs_init);

module_exit(procfs_exit);

MODULE_AUTHOR("dragon");

MODULE_LICENSE("GPL");

时间: 2024-08-14 03:10:45

简单的procfs模型的相关文章

一个简单的MVC模型实现

function Event(sender) { this._sender = sender; this._listeners = []; } Event.prototype = { attach : function (listener) { this._listeners.push(listener); }, notify : function (args) { var index; for (index = 0; index < this._listeners.length; index

学习笔记(九)Filter 完成一个简单的权限模型 HttpServletWrapper 和 HttpServletResponseWrapper

2. HttpServletWrapper 和 HttpServletResponseWrapper 1). Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象,HttpServletRequestWrapper 类实现了 HttpServletRequest 接口中的所有方法, 这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法 //包装类实现 ServletRequest 接口. publ

使用C++实现一套简单的状态机模型——实例

一般来说,"状态机"是一种表达状态转换变换逻辑的方法.曾经有人和我讨论过为什么不直接用ifelse,而要使用"状态机"去实现一些逻辑,认为使用"状态机"是一种炫技的表现.然而对于大型复杂逻辑的变化和跳转,使用ifelse将带来代码难以阅读等弊端.其实ifelse也是一种状态机实现的方式. 之前我们有个业务和操作系统有着强烈的关联,而我们希望比较清晰地描述整个业务中各个子业务的过程,就引入了状态机描述的方式.可是当时的状态机是使用if else方法

使用C++实现一套简单的状态机模型——原理解析

在上一文中,我们介绍了该状态机模型的使用方法.通过例子,我们发现可以使用该模型快速构建满足基本业务需求的状态机.本文我们将解析该模型的基础代码,以便大家可以根据自己状态机特点进行修改.(转载请指明出于breaksoftware的csdn博客) 该模板库的基础方法实现在之后给出的工程的AutoStateChart.h中,该文件一共215行,其中有16行是辅助调试代码.以上一文中状态机类为例: class CMachine_Download_Run_App : public AutoStateCha

CI 搭建简单的MVC模型示例

1.下载CI框架源码 http://codeigniter.org.cn/download 2.我们主要的开发在application 文件夹进行,可以自己根据项目重命名文件夹.(例如公司名称_application,公司名称_system) 3.application->config 里面可以配置相关的内容(以后慢慢添加),数据库的连接配置在database.php 文件夹, $db['default']['hostname'] = 'localhost'; $db['default']['u

[您有新的未分配科技点]博弈论进阶:似乎不那么恐惧了…… (SJ定理,简单的基础模型)

这次,我们来继续学习博弈论的知识.今天我们会学习更多的基础模型,以及SJ定理的应用. 首先,我们来看博弈论在DAG上的应用.首先来看一个小例子:在一个有向无环图中,有一个棋子从某一个点开始一直向它的出点移动,双方轮流操作,无法操作者输,问是否先手必胜. 考虑一下我们之前的Nim游戏,如果我们把后继状态看成后继点的话,不难发现Nim游戏的互相转移也是一个DAG.因此,DAG上出度为0的点的sg值为0,再用上一篇博客提到的mex操作来求每个点的值就可以了(注意,这并不是一个"大"子图,不能

UDP协议----简单的CS模型实现

UDP简单介绍 传输层主要应用的协议模型有两种,一种是TCP协议,另外一种则是UDP协议.TCP协议在网络通信中占主导地位,绝大多数的网络通信借助TCP协议完成数据传输.但UDP也是网络通信中不可或缺的重要通信手段. 相较于TCP而言,UDP通信的形式更像是发短信.不需要在数据传输之前建立.维护连接.只专心获取数据就好.省去了三次握手的过程,通信速度可以大大提高,但与之伴随的通信的稳定性和正确率便得不到保证.因此,我们称UDP为"无连接的不可靠报文传递". 那么与我们熟知的TCP相比,

Realm数据库的使用(一)数据库的简单介绍和模型的创建

Realm 是一种可以替代SQLite 和CoreData的移动端数据库 使用前提: iOS >= 7 or Mac OS X >= 10.9 Xcode >= 6 Both Objective-C & Swift are supported. 安装: 可通过CocoaPods加入项目中 pod serarch 'Realm' Realm浏览器/数据库管理器 可以通过工具查看和浏览数据 Xcode 插件: 一个可以快速创建Realm模型的插件 模型: Realm 数据模型其实就是

几种简单的主题模型(生成模型)

了解主题模型,一般都会提到几种最基础的生成模型:Unigram model.Mixture of unigram,pLSA,接下来简单介绍一下他们之间的区别: 1.Unigram model 左图可知,一篇文档由词生成,每个词有其出现的概率,所有词概率的乘积即得到生成文档的概率. 2.Mixture of unigram 相比unigram多了一层主题的条件概率,在各主题下出现的所有词的概率乘积之和即为生成文档的概率. 3.pLSA plsa与mix unigram的区别是给定了多个可能的主题,