免费注册 查看新帖 |

Chinaunix

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

[文件系统] kernel中读取文件,只读取到文件部分内容(前1013个字节) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-25 17:34 |显示全部楼层 |倒序浏览
本帖最后由 wokao112358 于 2013-11-28 12:23 编辑

  filp=filp_open(filename,O_RDONLY,0);
  inode=filp->f_dentry->d_inode;   
  magic=inode->i_sb->s_magic;
  printk("<1>file system magic:%li \n",magic);
  printk("<1>super blocksize:%li \n",inode->i_sb->s_blocksize);//----->here is 4096
  printk("<1>inode %li \n",inode->i_ino); //----->here is 4904

  fsize=inode->i_size;
  printk("<1>file size:%i \n",(int)fsize);  //---->here is 4336 bytes
  buf=(char *) kmalloc(fsize+1,GFP_ATOMIC);

  fs=get_fs();
  set_fs(KERNEL_DS);
  filp->f_op->read(filp,buf,fsize,&(filp->f_pos));
  set_fs(fs);

  buf[fsize]='\0';
  printk("<1>The File Content is:\n");
  printk("<1>%s",buf); //---->only 1013 bytes printed

上述代码是在内核中编写,我希望是一次性把文件(4336字节)内容读取出来,但是实际打印的情况是只有文件的前1013个字节,
大神们,请问是操作系统有限制么?如果有限制的话,能告诉我是设置在什么地方么?
我上网没找到关于限制的信息,先谢谢各位了!

论坛徽章:
0
2 [报告]
发表于 2013-11-26 13:07 |显示全部楼层
本帖最后由 wokao112358 于 2013-11-26 14:09 编辑

read的返回值就是文件大小.
之前我犯了个错误,将log从linux下拷贝到window下时,'0A'被替换成了'0D0A';实际的打印的buf只有1013个字节,之后的就没打印出来
buf[1012]确实是被读取文件的第1023个字节,buf[1013]也不是'\0', 而是空格;buf[1014]我也打印了,不是'\0';
照理说不会打印到这里就停止了,所以我猜测可能是内核有限制,但是我查了printk的ring buf,即使整个文件的size也没有超;
#define CONFIG_LOG_BUF_SHIFT  14
#define __LOG_BUF_LEN(1 << CONFIG_LOG_BUF_SHIFT)

回复 2# firkraag


   

论坛徽章:
0
3 [报告]
发表于 2013-11-26 16:05 |显示全部楼层
我贴出来的代码就是这么做的,先全部读到buf,然后打印buf;
但是发现只打印了部分(打印了1013个字节),但是read返回值确实是文件的大小;
我也选择性的打印了一些字节,如buf[2040], 和文件内容也是一致的。
回复 4# Godbach


   

论坛徽章:
0
4 [报告]
发表于 2013-11-27 10:22 |显示全部楼层
配置文件由于保密问题没法上传。。。
read返回值是文件的长度;
我一次读取了buf中的每个字节,发现只有buf最后一个字节是‘\0’;
但是打印的时候确实没有打印完全。回复 6# firkraag


   

论坛徽章:
0
5 [报告]
发表于 2013-11-27 10:23 |显示全部楼层
这个可以确定的;
read返回值是文件的长度;
我依次读取了buf中的每个字节,发现只有buf最后一个字节是‘\0’;
但是打印的时候确实没有打印完全。
回复 10# asuka2001


   

论坛徽章:
0
6 [报告]
发表于 2013-11-27 10:25 |显示全部楼层
本帖最后由 wokao112358 于 2013-11-27 10:31 编辑

1、 read返回值是文件的长度;
2、read结束的条件就是入参fsize或者读到文件末尾,可以这么理解吧?
3、我依次读取了buf中的每个字节,发现只有buf最后一个字节是‘\0’;
     我也选取了buf中靠后的一些字节进行打印,发现跟文件内容也是一致的;
但是整个打印buf的时候没有打印完全。
回复 9# Godbach


   

论坛徽章:
0
7 [报告]
发表于 2013-11-27 10:31 |显示全部楼层
嗯,好的,我先试试你说的这个回复 14# Godbach


   

论坛徽章:
0
8 [报告]
发表于 2013-11-27 20:05 |显示全部楼层
是我刚发帖的时候搞错了,其实是1013个字节,之前打印的log文件在win下‘0A’被转成了'0D0A',所以字节数变多了;我马上改下帖子回复 17# asuka2001


   

论坛徽章:
0
9 [报告]
发表于 2013-11-27 20:07 |显示全部楼层
谢谢各位的帮助,我再看看源码!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP