从seq_file接口读取的数据不全

原创 2012年03月21日 20:53:33

好久没写博客了。每当一天过去感觉毫无收获,工作内容无趣,或者觉得做这些事完全是浪费时间时,就会想通过某种方式督促自己有所总结,重新思考学习方式,改变学习策略。总之,在工作内容很不乐观的情况下,维持原状是最坏的选择。应急而变,多试一下学习方法与模式,一来调节下当前状态,二来后续若再遇此境,转变也会来的及时。


标题所述的事已经是一个月前遇到的了。彼时的任务只是从内核态导出一些数据。seq_file大名早有耳闻,难得有此机会,何不使用一番?


虽说这东西很早就知道了,却一直懒于思考其原理。在工作环境中用了,思考的驱动力自然要大一些。好在东西并不复杂,尝试几番,很快就实现了功能。本以为事情至此便结束,不料几天以后,发现数据总是读少了。这还不一定是seq_file的原因,说不定是内核生成的数据少了。几经排查,问题确实出在seq_file接口上。稀奇的是,用cat读到的和用dd读到的数据数量居然不一样。就算是用dd,设置不同的bs,得到的结果也不尽相同。要求交差日期逼进,使用陌生接口带来的窘境立马显现了出来。顶着压力看代码确实不是滋味。好在后来需求变化,这个东西最终没有用上场。


可是问题仍未解决。没有工作的压力,自己又懒得去研究其中的细节。话说回来,也没“要使用接口先看懂接口实现”这种事。虽然心里有一丝放不下,此事最终还是过去。不得不感叹工作以后,激情骤减,毅力全无。若是一年前还在校园时,必然会全力搞懂细节。现在却感觉这样做很累。这种转变,也才发生在不一年之内。


一次在网吧下东西,闲来无事,想起了这个东西。这种情况已经发生太多次了,以前这种时候是玩ZUMA,后来腻了,碰到这种时候就看资料。我记得在这种情形下看过USB spec,USB Mass Storage spec,这一次,自然是研究seq_file。


在lxr上看了半天,大致找到了原因。seq_start'的时候返回第一个object,我采用的策略是:如果内部的一个index为0就返回处一个object,不然返回NULL。背后的想法是,我不打算支持seek。看了代码才知道,就没有seek,当seq_file扩大内存时,还会重新调一次seq_start,于是悲剧发生。


找到了这个地方,我又不想往下看了。这东西在工作中也无需再使用,因此也没有验证。但是后来在某份内核文档里看到,因为seq_file实现的原理,dd或者cat可能读不全数据。这让我觉得很稀奇,这难道不是一个BUG?可能seq_file最终就是如此,也有可能文档太老,seq_file初期是如此,后面已经改好了。


虽然最终没有透彻地搞懂,这次经历就当是业余自主学习吧。

相关文章推荐

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

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

序列文件(seq_file)接口

序列文件(seq_file)接口 2009-09-28 11:01 93人阅读 评论(0) 收藏 举报 内容简介: 本文主要讲述序列文件(seq_file)接口的内核实现,如何使用它...

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

一、procfs procfs是比较老的一种用户态与内核态的数据交换方式,内核的很多数据都是通过这种方式出口给用户的,内核的很多参数也是通过这种方式来让用户方便设置的。除了sysctl出口到/p...

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

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

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

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

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

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

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

原文:http://hi.baidu.com/zhaoercheng/blog/item/aff223f4ad796f3d730eec44.html 一般地,内核通过在procfs文件系...

seq_file文件的内核读取过程

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

seq_file文件的内核读取过程

seq_file文件的内核读取过程 1 问题 seq_file只是在普通的文件read中加入了内核缓冲的功能,从而实现顺序多次遍历,读取大数据量的简单接口。seq_file一般只提供只读接...

读取proc文件之seq_file

kernel module编程(八):读取proc文件之seq_file    在上次我们使用了read_proc的方式通过/proc文件读取kernel module的信息。作者给的例子他自己说是...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:从seq_file接口读取的数据不全
举报原因:
原因补充:

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