seq_file的用法

原创 2012年03月29日 20:44:44

/*

初始化代码

*/

entry = create_proc_entry(cache_file_path, 0, NULL);

if (entry) {

entry->proc_fops = &flashcache_cache_operations;

entry->data = dmc;

}

kfree(s);


/*

销毁函数代码

*/

remove_proc_entry(cache_file_path,NULL);

kfree(s);



简单的方式single_open

static int

flashcache_version_show(struct seq_file*seq, void *v)

{

seq_printf(seq, "FlashcacheVersion : %s\n", flashcache_sw_version);

#ifdef COMMIT_REV

seq_printf(seq, "git commit:%s\n", COMMIT_REV);

#endif

return 0;

}


static int

flashcache_version_open(struct inode*inode, struct file *file)

{

return single_open(file,&flashcache_version_show, PDE(inode)->data);

}


static struct file_operationsflashcache_version_operations = {

.open = flashcache_version_open,

.read = seq_read,

.llseek = seq_lseek,

.release = single_release,

};

优缺点:

这种方法的好处就在于简单,但是经过测试在一个show函数里的seq_printf会先输出到seq_filebuff里面,当输出数据过大的时候很出现缓冲区溢出的错误,导致cannotallocate memory的错误。


复杂的方式seq_open

/*

如果当前迭代位置超过了列表的边界,则返回NULL

*/

static void*flashcache_cache_start(struct seq_file *seq, loff_t *pos)

{

struct cache_c *dmc = seq->private;


if(*pos >= (dmc->num_sets *dmc->assoc)) {

return NULL;

}

return &dmc->cache[*pos];

}

/*

如果当前迭代位置超过了列表的边界,则返回NULL

*/

static void*flashcache_cache_next(struct seq_file *seq, void *v, loff_t *pos)

{

struct cache_c *dmc = seq->private;

(*pos)++;

if(*pos >= (dmc->num_sets *dmc->assoc)) {

return NULL;

}

return &dmc->cache[*pos];

}

static voidflashcache_cache_stop(struct seq_file *seq, void *v)

{

}

/*

如果该函数输出的数据较少,则返回到next函数中继续迭代。当show函数产生一定数量的输出之后,迭代进入到start函数中。当nextstart函数中有一个返回NULL,则迭代停止

*/

static int flashcache_cache_show(structseq_file *seq, void *v)

{

struct cacheblock *cache = (structcacheblock *)v;


if(cache->cache_state & VALID){

seq_printf(seq, "%llu ",(u_int64_t)cache->dbn);

}

return 0;

}


static struct seq_operationsflashcache_cache_seq_ops = {

.start = flashcache_cache_start,

.next = flashcache_cache_next,

.stop = flashcache_cache_stop,

.show = flashcache_cache_show,

};


/*

在这里设置seq_fileprivateprivate作为私有成员在迭代中传递

*/

static int

flashcache_cache_open(struct inode*inode, struct file *file)

{

struct seq_file *seq;

int ret;

ret = seq_open(file,&flashcache_cache_seq_ops);

if(ret) {

return ret;

}

seq = (struct seq_file*)file->private_data;

seq->private = PDE(inode)->data;


return 0;

}


static struct file_operationsflashcache_cache_operations = {

.open = flashcache_cache_open,

.read = seq_read,

.llseek = seq_lseek,

.release = seq_release,

};


参考文献


相关文章推荐

seq_file proc 文件系统的实现

  • 2012年04月13日 22:44
  • 177KB
  • 下载

在 Linux 下用户空间与内核空间数据交换的方式,第 2 部分: procfs、seq_file、debugfs和relayfs

本系列文章包括两篇,它们文详细地地介绍了Linux系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数、模块参数与sysfs、sysctl、系统调用、netlink、procfs、seq_fi...

用户空间与内核空间数据交换的方式------seq_file

一般地,内核通过在procfs文件系统下建立文件来向用户空间提供输出信息,用户空间可以通过任何文本阅读应用查看该文件信息,但是procfs 有一个缺陷,如果输出内容大于1个内存页,需要多次读,因此处理...

利用seq_file在proc下添加文件

源自:http://blog.chinaunix.net/uid-317451-id-92670.html #include linux/kernel.h> #include ...

seq_file工作机制实例

分类: LINUX 内容简介 本文主要讲述序列文件(seq_file)接口的内核实现,如何使用它将Linux内核里面常用的数据结构通过文件(主要关注proc文件)导出到用户空间,最...

用户空间内核空间ipc总结(sockopt,ioctl,mmap,netlink,proc,seq,file,copy_user)

多数的 Linux 内核态程序都需要和用户空间的进程交换数据,但 Linux 内核态无法对传统的 Linux 进程间同步和通信的方法提供足够的支持! 本文就总结下常见的ipc, getsockopt/...

【转载】在 Linux 下用户空间与内核空间数据交换的方式,第 2 部分: procfs、seq_file、debugfs和relayfs

燚 杨 (yang.y.yi@gmail.com), 计算机科学硕士 简介: 本系列文章包括两篇,它们文详细地地介绍了Linux系统下用户空间与内核空间数据交换的九种方式,包括内核启动参数、模块参...

Linux内核学习笔记之seq_file接口创建可读写proc文件

学习笔记与个人理解,如有错误,欢迎指正。 温馨提示:建议跟着注释中的编号顺序阅读代码 测试方法:cat /proc/abc_proc                    echo 任意字符串 >/...

seq_file文件的内核读取过程

FROM:http://www.cnblogs.com/Wandererzj/archive/2012/04/16/2452209.html seq_file文件的内核读取过程 1 问...
  • LBO4031
  • LBO4031
  • 2012年11月12日 20:20
  • 4318

seq_file operations, with PPP dump implimentation

intro with kernel module and function impliment, we usually export some info to let others know its ...
  • flxue
  • flxue
  • 2015年12月29日 22:36
  • 405
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:seq_file的用法
举报原因:
原因补充:

(最多只允许输入30个字)