免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2371 | 回复: 4
打印 上一主题 下一主题

seq_file请教 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-11-13 16:56 |只看该作者 |倒序浏览
10可用积分
要在/proc/net/中创建一个test_proc文件, cat /proc/net/test_proc的时候输出8M*4的数据
eg:

cat /proc/net/test_proc
0=0,0=1,0=2,0=3
1=0,1=1,1=2,1=3
....
....
8M-1=0,8M-1=1,8M-1=2,8M-1=3

最佳答案

查看完整内容

请参考http://linux.chinaunix.net/bbs/thread-1044672-1-1.html实例讲解如何创建一个seq_file到/proc/net下

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
2 [报告]
发表于 2008-11-13 16:56 |只看该作者
原帖由 ubuntuer 于 2008-11-13 16:56 发表
要在/proc/net/中创建一个test_proc文件, cat /proc/net/test_proc的时候输出8M*4的数据
eg:

cat /proc/net/test_proc
0=0,0=1,0=2,0=3
1=0,1=1,1=2,1=3
....
....
8M-1=0,8M-1=1,8M-1=2,8M-1=3



请参考
http://linux.chinaunix.net/bbs/thread-1044672-1-1.html
实例讲解如何创建一个seq_file到/proc/net下

论坛徽章:
0
3 [报告]
发表于 2008-11-13 19:18 |只看该作者
static void *my_seq_start(struct seq_file *s, loff_t *pos)
{
        static unsigned long counter = 0;
        printk(KERN_INFO"Invoke start\n");
        /* beginning a new sequence ? */
        if ( *pos < MAX_LINES )
        {
                /* yes => return a non null value to begin the sequence */
                printk(KERN_INFO"pos == 0\n");
                return &counter;
        }
        else
        {
                /* no => it's the end of the sequence, return end to stop reading */
                *pos = 0;
                printk(KERN_INFO"pos != 0\n");
                return NULL;
        }
}

static void *my_seq_next(struct seq_file *s, void *v, loff_t *pos)
{
        unsigned long *tmp_v = (unsigned long *)v;
        printk(KERN_INFO"Invoke next\n");
        (*tmp_v)++;
    *pos = *tmp_v;        
    return tmp_v;
}

static void my_seq_stop(struct seq_file *s, void *v)
{
        printk(KERN_INFO"Invoke stop\n");
        /* nothing to do, we use a static value in start() */
}

static int my_seq_show(struct seq_file *s, void *v)
{
       int i;
       printk(KERN_INFO"Invoke show\n");
        loff_t *spos = (loff_t *) v;
    for (i = 0; i < 4; i++)
    {
      items[i].key = *spos;
    }
      items[0].value = '0';
      items[1].value = '1';
      items[2].value = '2';
      items[3].value = '3';
      seq_printf(s, "%ld=%c,%ld=%c,%ld=%c,%ld=%c\n", items[0].key,
         items[0].value, items[1].key, items[1].value, items[2].key,
         items[2].value, items[3].key, items[3].value);
        return 0;
}


上面是我start,next,show3个函数的实现MAX_LINES就是80,我测试的时候用的小点的数字
但是每次都是多输出几个...

还有个问题就是我cat /proc/net/test_proc后输出一串数字...
然后我接着在cat /proc/net/test_proc他接着输出了,我知道*pos有清0当时*tmp_v没有清0,可是就算这样的话,也是打印*pos < MAX_LINES 次阿.次数又明显不对...

真麻烦了阿,版主dreamice

[ 本帖最后由 ubuntuer 于 2008-11-13 19:23 编辑 ]

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
4 [报告]
发表于 2008-11-13 20:46 |只看该作者

回复 #3 ubuntuer 的帖子

我不知道你item是怎么定义的;
另外很重要的一点,打印的次数是有next()控制的

  1. static void *my_seq_next(struct seq_file *s, void *v, loff_t *pos)
  2. {
  3.         unsigned long *tmp_v = (unsigned long *)v;
  4.         printk(KERN_INFO"Invoke next\n");
  5.         if (*pos < MAX_LINES) {
  6.         (*tmp_v)++;
  7.     *pos = *tmp_v;        
  8.     return tmp_v;
  9.     } else
  10.          return NULL;
  11. }
复制代码


在show里面,也要加以判断。你先理清楚它的执行流程。

[ 本帖最后由 dreamice 于 2008-11-14 09:06 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2008-11-14 10:47 |只看该作者
感谢版主的帮助,问题终于得到解决

[ 本帖最后由 ubuntuer 于 2008-11-14 12:03 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP