免费注册 查看新帖 |

Chinaunix

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

seq_file output buffer [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-27 12:35 |只看该作者 |倒序浏览
seq file为了解决proc file需要输出内容的大小超过一个页面大小的问题。
包括总的大小,和单个记录的大小。
1. 总的大小超过的情况:
单个记录大小为2000,共100个:
May 27 10:39:56 RHEL5 kernel: mydrv_init, INFONUM = 2000
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: *pos = 0                 -----> start:
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: *pos equal to off 0
May 27 10:40:00 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0     -----> show:可以正常输出(2000)
May 27 10:40:00 RHEL5 kernel: mydrv_seq_next: *pos = 1
May 27 10:40:00 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0     -----> show:可以正常输出(4000)
May 27 10:40:00 RHEL5 kernel: mydrv_seq_next: *pos = 2
May 27 10:40:00 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = -1    -----> show:不可以正常输出(6000>4096)
May 27 10:40:00 RHEL5 kernel: mydrv_seq_stop                            -----> stop:
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: *pos = 2                 -----> start:从第3条记录(没有成功输出的那条),重新开始输出
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: off = 1
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: off = 2
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: *pos equal to off 2
May 27 10:40:00 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0     -----> show:可以正常输出(6000)
May 27 10:40:00 RHEL5 kernel: mydrv_seq_next: *pos = 3
May 27 10:40:00 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0     -----> show:可以正常输出(8000)
May 27 10:40:00 RHEL5 kernel: mydrv_seq_next: *pos = 4
May 27 10:40:00 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = -1    -----> show:不可以正常输出(10000>4096*2)
May 27 10:40:00 RHEL5 kernel: mydrv_seq_stop                            -----> stop:
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: *pos = 4
May 27 10:40:00 RHEL5 kernel: mydrv_seq_start: off = 0
再来看个例子,单个记录大小是4000,共100个:
May 27 10:47:28 RHEL5 kernel: mydrv_init, INFONUM = 4000
May 27 10:47:31 RHEL5 kernel: mydrv_seq_start: *pos = 0                 -----> start:
May 27 10:47:31 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:47:31 RHEL5 kernel: mydrv_seq_start: *pos equal to off 0
May 27 10:47:31 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0     -----> show:可以正常输出(4000)
May 27 10:47:31 RHEL5 kernel: mydrv_seq_next: *pos = 1
May 27 10:47:31 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = -1    -----> show:不可以正常输出(8000>4096)
May 27 10:47:31 RHEL5 kernel: mydrv_seq_stop                            -----> stop:
May 27 10:47:31 RHEL5 kernel: mydrv_seq_start: *pos = 1                 -----> start:从第2条记录(没有成功输出的那条),重新开始输出
May 27 10:47:31 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:47:31 RHEL5 kernel: mydrv_seq_start: off = 1
May 27 10:47:31 RHEL5 kernel: mydrv_seq_start: *pos equal to off 1
May 27 10:47:31 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0
May 27 10:47:31 RHEL5 kernel: mydrv_seq_next: *pos = 2
May 27 10:47:31 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = -1
May 27 10:47:31 RHEL5 kernel: mydrv_seq_stop
May 27 10:47:31 RHEL5 kernel: mydrv_seq_start: *pos = 2
May 27 10:47:31 RHEL5 kernel: mydrv_seq_start: off = 0
可以看出,当不能成功show的时候,将重新start开始输出。
采用的输出缓冲区大小为4096。
2. 单个记录的大小超过的情况
单个记录大小为5000,共100个:
May 27 10:50:34 RHEL5 kernel: mydrv_init, INFONUM = 5000
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: *pos = 0                 -----> start:
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: *pos equal to off 0
May 27 10:50:39 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = -1    -----> show:不可以正常输出(5000>4096)
May 27 10:50:39 RHEL5 kernel: mydrv_seq_stop                            -----> stop:
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: *pos = 0                 -----> start:增大了缓冲区大小,猜测4096*2=8192
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: *pos equal to off 0
May 27 10:50:39 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0     -----> show:可以正常输出(5000)
May 27 10:50:39 RHEL5 kernel: mydrv_seq_stop                            -----> stop:如果存在增大缓冲区的动作,那么正常输出一个后就stop(缓冲区采用*2的增大方式,的确不可能输出两个的)
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: *pos = 1                 -----> start:使用已经增大的缓冲区
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: off = 1
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: *pos equal to off 1
May 27 10:50:39 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0     -----> show:可以正常输出(10000)
May 27 10:50:39 RHEL5 kernel: mydrv_seq_stop                            -----> stop:
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: *pos = 2
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: off = 1
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: off = 2
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: *pos equal to off 2
May 27 10:50:39 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0
May 27 10:50:39 RHEL5 kernel: mydrv_seq_stop
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: *pos = 3
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:50:39 RHEL5 kernel: mydrv_seq_start: off = 1
再来看个例子,单个记录大小是10000,共100个:
May 27 10:57:12 RHEL5 kernel: mydrv_init, INFONUM = 10000
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos = 0                 -----> start:
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos equal to off 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = -1    -----> show:不可以正常输出(10000>4096)
May 27 10:57:14 RHEL5 kernel: mydrv_seq_stop                            -----> stop:
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos = 0                 -----> start:增大了缓冲区大小,猜测4096*2=8192
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos equal to off 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = -1    -----> show:不可以正常输出(10000>4096*2)
May 27 10:57:14 RHEL5 kernel: mydrv_seq_stop                            -----> stop:
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos = 0                 -----> start:增大了缓冲区大小,猜测4096*2*2=16384
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos equal to off 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0     -----> show:可以正常输出(10000)
May 27 10:57:14 RHEL5 kernel: mydrv_seq_stop                            -----> stop:存在增大缓冲区的动作,所以正常输出一个后就stop
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos = 1                 -----> start:使用已经增大的缓冲区
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 1
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos equal to off 1
May 27 10:57:14 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0     -----> show:可以正常输出(20000)
May 27 10:57:14 RHEL5 kernel: mydrv_seq_stop                            -----> stop:存在增大缓冲区的动作,所以正常输出一个后就stop
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos = 2                 -----> start:使用已经增大的缓冲区
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 1
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 2
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos equal to off 2
May 27 10:57:14 RHEL5 kernel: mydrv_seq_show: ret of seq_printf = 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_stop
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: *pos = 3
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 0
May 27 10:57:14 RHEL5 kernel: mydrv_seq_start: off = 1
可以看出,第一条记录就不能成功show,将增大缓冲区,增大的方式是*2。
如果增大后可以正常输出,那么输出一条记录,并且stop。然后重新start->show->stop。
如果增大后还是不可以正常输出,那么继续增大,也就是说不停的*2。直到可以正常输出。
确定了缓冲区大小后,每次只能输出一条记录。所以之后看到的过程就是start->show->stop的循环了。
采用的输出缓冲区大小为4096*2...

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/110937/showart_2162024.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP