免费注册 查看新帖 |

Chinaunix

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

帮我看看mmap的Invalid argument问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-03-08 15:27 |只看该作者 |倒序浏览


  1. typedef struct
  2. {
  3.         int integer;
  4.         char string[24];
  5. }RECORD;


  6. int main()
  7. {
  8.         RECORD record, *mapped;
  9.         int i, f;

  10.         f = open("/usr/records.dat", O_RDWR);
  11.        
  12.         if(f < 0)
  13.         {
  14.                 perror(" open target ");
  15.                 exit(0);
  16.         }
  17.         mapped = (RECORD *)mmap(0, 100663319*sizeof(record), PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);
  18.        
  19.         if(mapped == MAP_FAILED)
  20.         {
  21.                 perror(" mmap source");
  22.                 exit(0);
  23.         }
  24. }
复制代码


执行到mapped = (RECORD *)mmap(0, 100663319*sizeof(record), PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);
就出现
mmap source: Invalid argument报错了.
是不是我这个100663319数值太大了?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
2 [报告]
发表于 2007-03-08 15:39 |只看该作者
你用个小点的数试一试。

论坛徽章:
0
3 [报告]
发表于 2007-03-08 15:42 |只看该作者
用小一点,没问题的.
mmap不是説能处理大数据文件.

两三G的文件大小,就处理不了.
是不是机器的内存不够大啊?

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-03-08 15:47 |只看该作者
你先看看你机器内存的大小。
而且共享内存系统也是有大小限制的。

论坛徽章:
0
5 [报告]
发表于 2007-03-08 15:49 |只看该作者
  1. #include<stdio.h>
  2. #include<strings.h>
  3. #include<stdlib.h>
  4. #include<sys/mman.h>
  5. #include<sys/types.h>
  6. #include<sys/stat.h>
  7. #include<fcntl.h>
  8. typedef struct
  9. {
  10.         int integer;
  11.         char string[24];
  12. }RECORD;


  13. int main()
  14. {
  15.         RECORD record, *mapped;
  16.         int  f;

  17.         f = open("/usr/records.dat", O_RDWR);
  18.       
  19.         if(f < 0)
  20.         {
  21.                 perror(" open target ");
  22.                 exit(0);
  23.         }
  24.         mapped = (RECORD *)mmap(0, 100663319*sizeof(record), PROT_READ|PROT_WRITE, MAP_SHARED, f, 0);
  25.       
  26.         if(mapped == MAP_FAILED)
  27.         {
  28.                 perror(" mmap source");
  29.                 exit(0);
  30.         }
  31.         return 0;
  32. }
复制代码



  1. [root@ljjk code]# gcc -Wall -O2 fff.c -o fff
  2. [root@ljjk code]# uname -a
  3. Linux ljjk 2.6.9-1.667 #1 Tue Nov 2 14:41:25 EST 2004 i686 i686 i386 GNU/Linux
  4. [root@ljjk code]# gcc -v
  5. Reading specs from /usr/lib/gcc/i386-redhat-linux/3.4.2/specs
  6. Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --enable-shared --enable-threads=posix --disable-checking --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-java-awt=gtk --host=i386-redhat-linux
  7. Thread model: posix
  8. gcc version 3.4.2 20041017 (Red Hat 3.4.2-6.fc3)
  9. [root@ljjk code]# ./fff
  10. [root@ljjk code]# cat /proc/meminfo
  11. MemTotal:       256116 kB
  12. MemFree:          3552 kB
  13. Buffers:          6948 kB
  14. Cached:          58336 kB
  15. SwapCached:      39828 kB
  16. Active:         210624 kB
  17. Inactive:        20040 kB
  18. HighTotal:           0 kB
  19. HighFree:            0 kB
  20. LowTotal:       256116 kB
  21. LowFree:          3552 kB
  22. SwapTotal:      811240 kB
  23. SwapFree:       717800 kB
  24. Dirty:             168 kB
  25. Writeback:           0 kB
  26. Mapped:         202332 kB
  27. Slab:            14540 kB
  28. Committed_AS:   563888 kB
  29. PageTables:       2884 kB
  30. VmallocTotal:  3874808 kB
  31. VmallocUsed:      2740 kB
  32. VmallocChunk:  3871932 kB
  33. HugePages_Total:     0
  34. HugePages_Free:      0
  35. Hugepagesize:     4096 kB
  36. [root@ljjk code]#


复制代码

[ 本帖最后由 1jjk 于 2007-3-8 15:50 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-03-08 15:54 |只看该作者
可能是我机器的内存不大.
我找台内存大的服务器
测试测试

论坛徽章:
0
7 [报告]
发表于 2007-03-08 15:58 |只看该作者
mmap参数用的是size_t类型.

我机器的size_t是int32.

你那个计算出来int32早撑死了

100, 663, 319 * (4 + 24) /* 我估计的... */
28 * 100 MB = 2.8 GB /* 你计算错了吧? */

论坛徽章:
0
8 [报告]
发表于 2007-03-08 16:02 |只看该作者
我是用ll -h 查看的

2.6G Mar  8 14:55 records.dat

论坛徽章:
0
9 [报告]
发表于 2007-03-08 16:03 |只看该作者
我刚用1G内存的机器测试也出现问题.

论坛徽章:
0
10 [报告]
发表于 2007-03-08 16:07 |只看该作者
原帖由 Edengundam 于 2007-3-8 15:58 发表
mmap参数用的是size_t类型.

我机器的size_t是int32.

你那个计算出来int32早撑死了

100, 663, 319 * (4 + 24) /* 我估计的... */
28 * 100 MB = 2.8 GB /* 你计算错了吧? */

size_t是无符号32位,是否撑死好像没什么关系吧?最多超出4G溢出后从0开始嘛
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP