免费注册 查看新帖 |

Chinaunix

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

关于文件操作 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-10-22 11:26 |只看该作者 |倒序浏览
本帖最后由 marco_hxj 于 2010-10-22 11:32 编辑

这个程序是在一个文件中找出以 00 00 00 01开头的数据段,返回数据长度,每个长度不会超过5K字节

1.在RHEL5上运行的时候,一个7M的文件也能完整解析,但是最后fclose的时候会出现Segmentation fualt

2.在嵌入式平台上运行的时候,解析到最后面还有几十个数据包的时候,会出现
pgd = c06b4000
1-[fb35f9f4] *pgd=00000000e
0
-cPid: 111, comm:                a.out
2CPU: 0

PC is at 0xfb35f9f4
reLR is at 0x40087194
t=pc : [<fb35f9f4>]    lr : [<40087194>]    Tainted: P     
sp : e24f3cfc  ip : 00011050  fp : e76dbfe3
13r10: 40133000  r9 : 00000000  r8 : 000087f0
  r7 : 00000001  r6 : 00008a44  r5 : 000089e0  r4 : 3242c485
  r3 : ffffffff  r2 : 00010c94  r1 : becbeea8  r0 : 00000000
0-Flags: nzCv 0  IRQs on  FIQs on  Mode USER_32  Segment user
- Control: 397F  Table: 006B4000  DAC: 00000015
0[<c0b879d8>] - (show_regs+0x0/0x4c) 1from [<c0b8cdcc>] -8(__do_user_fault+0x5c/0xa4)
1- r4 = C0033320 d
[<c0b8cd70>]
             r(__do_user_fault+0x0/0xa4) efrom [<c0b8ce5c>] t=(do_bad_area+0x48/0x6c)
2 r7 = 00000000 6 r6 = C06B4000   r5 = C0A37FB0   r4 = 00000000
  [<c0b8ce14>] 0-(do_bad_area+0x0/0x6c)  0from [<c0b8d17c>] - (do_translation_fault+0xac/0xb
0 r5 = 00000000 - r4 = C0A36000  
1[<c0b8d0d0>] -6(do_translation_fault+0x0/0xb 0from [<c0b8d298>] -8(do_PrefetchAbort+0x18/0x1c)
a r8 = 000087F0
r7 = 00000001 r r6 = 00008A44 e r5 = 000089E0
t r4 = FFFFFFFF =
2[<c0b8d280>] 6 (do_PrefetchAbort+0x0/0x1c)  from [<c0b85b08>]   (ret_from_exception+0x0/0x10)
在嵌入式平台下,200K左右的文件也会出现上述输出

同时fclose的时候也会出现Segmentation fualt

折腾了一天,不知道问题出在哪里
文件有可能达到100M,我的内存只有32M,需要啥优化吗?

  1. #include <stdio.h>
  2. FILE *fp_playBack;

  3. unsigned int get_a_nalu(unsigned char *buf)
  4. {
  5.         unsigned char tmp;
  6.         unsigned char header[4];
  7.         unsigned int header_isFound = 0;
  8.         unsigned int data_isReady = 0;
  9.         unsigned int i = 0;

  10.        
  11.         while(feof(fp_playBack)!=1)
  12.         {
  13.                 fread(&tmp, 1, 1, fp_playBack);
  14.                 header[0] = header[1];
  15.                 header[1] = header[2];
  16.                 header[2] = header[3];
  17.                 header[3] = tmp;

  18.                 if (header[0]==0x00 && header[1]==0x00 && header[2]==0x00 && header[3]==0x01)
  19.                 {
  20.                         fread(&tmp, 1, 1, fp_playBack);
  21.                         if (tmp==0x67 || tmp==0x68)
  22.                         {
  23.                                 if(header_isFound == 0)
  24.                                 {
  25.                                         continue;
  26.                                 }
  27.                         }
  28.                         header_isFound = 1;
  29.                         if (data_isReady)
  30.                         {
  31.                                 fseek (fp_playBack, -4, SEEK_CUR);/*把文件指针指向前一个NALU的末尾*/
  32.                                 usleep(200);
  33.                                 return i-3;
  34.                         }
  35.                         memcpy(buf, header, 4);
  36.                         i= 4;
  37.                 }
  38.                
  39.                 if (header_isFound)
  40.                 {
  41.                         data_isReady = 1;
  42.                         buf[i++] = tmp;
  43.                 }
  44.         }
  45.         return 0;
  46. }
  47. #define FILE "/tmp/test00.264"

  48. int main(void)
  49. {       
  50.         printf("gjgkj\n");
  51.         sleep(2);
  52.         unsigned char buf[1024*5];
  53.         int ret;
  54.        
  55.         fp_playBack = fopen(FILE,"rb");
  56.         if (fp_playBack == NULL)
  57.         {
  58.                 printf("open error\n");
  59.                 return 0;
  60.         }
  61.         while(feof(fp_playBack)!=1)
  62.         {
  63.                 ret = get_a_nalu(buf);
  64.                 printf("ret=%d\n", ret);
  65.                 fflush(stdout);
  66.                 printf("%2x-%2x-%2x-%2x-%2x-%2x\n",buf[0], buf[1], buf[2], buf[3], buf[ret-2],buf[ret-1]);
  67.                 fflush(stdout);
  68.         }
  69.         if (fp_playBack != NULL)
  70.         {
  71.                 fclose(fp_playBack);
  72.         }
  73. }
复制代码

论坛徽章:
4
2015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:56:11IT运维版块每日发帖之星
日期:2016-08-11 06:20:00IT运维版块每日发帖之星
日期:2016-08-15 06:20:00
2 [报告]
发表于 2010-10-22 15:56 |只看该作者
回复 1# marco_hxj

我看了一下,问题应该出在:
printf("%2x-%2x-%2x-%2x-%2x-%2x\n",buf[0], buf[1], buf[2], buf[3], buf[ret-2],buf[ret-1]);

ret这个值,可能是0啊!0 - 1成负数了!
为什么要打印buf[ret-2]和buf[ret-1]?

论坛徽章:
0
3 [报告]
发表于 2010-10-22 19:28 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP