免费注册 查看新帖 |

Chinaunix

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

[文件系统] 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个字节,
大神们,请问是操作系统有限制么?如果有限制的话,能告诉我是设置在什么地方么?
我上网没找到关于限制的信息,先谢谢各位了!

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
2 [报告]
发表于 2013-11-26 10:03 |只看该作者
check the value of buf[1048] and the return value of the filp->f_op->read.

论坛徽章:
0
3 [报告]
发表于 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


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
4 [报告]
发表于 2013-11-26 15:04 |只看该作者
回复 3# wokao112358


这个好验证,你先把文件全部读到 buffer,然后再打印 buffer,比如按照 hex 打印之类的。

此外,read 返回的长度总共有多少呢。

   

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


   

论坛徽章:
1
双鱼座
日期:2013-08-28 13:47:26
6 [报告]
发表于 2013-11-26 16:13 |只看该作者
回复 5# wokao112358
Can you upload you file?

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
7 [报告]
发表于 2013-11-26 16:29 |只看该作者
回复 5# wokao112358


printk("<1>%s",buf); //---->only 1048 bytes printed


你按字符串打印,万一 buf里读的文件内容里有个0x00那当然printk就罢工了!

你确定你的文件内容里不可能有0x00?


   

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
8 [报告]
发表于 2013-11-26 16:30 |只看该作者
回复 5# wokao112358

printk("<1>%s",buf); //---->only 1048 bytes printed

你是按字符串进行打印的,除非你的文件内容里不会有0x00,否则一遇上0x00 printk就要罢工!


   

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
9 [报告]
发表于 2013-11-26 19:02 |只看该作者
回复 5# wokao112358

第一个问题: 你应该打印一下 read 的返回值。

第二个问题: read 的执行的时候应该是可以判断什么时候结束的,你没有判断 read 结束的逻辑。你就调用了一次 read,感觉应该是仅仅读取了一块。
filp->f_op->read(filp,buf,fsize,&(filp->f_pos));


   

论坛徽章:
17
水瓶座
日期:2013-08-29 12:09:27白羊座
日期:2014-08-07 12:36:42丑牛
日期:2014-07-24 12:44:41寅虎
日期:2014-04-16 16:15:33寅虎
日期:2014-03-12 09:28:43摩羯座
日期:2014-03-06 13:22:04技术图书徽章
日期:2014-03-06 11:34:50天蝎座
日期:2014-01-09 11:31:44寅虎
日期:2013-12-27 17:01:44双子座
日期:2013-12-27 12:32:29双子座
日期:2013-12-25 09:03:33丑牛
日期:2013-12-24 16:18:44
10 [报告]
发表于 2013-11-26 19:07 |只看该作者
回复 1# wokao112358


printk("<1>%s",buf); //---->only 1048 bytes printed

你确定文件内容中没有0x00?

   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP