免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 11870 | 回复: 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数值太大了?

论坛徽章:
0
22 [报告]
发表于 2007-03-09 11:52 |只看该作者
cat /proc/sys/kernel/shmmax

论坛徽章:
0
21 [报告]
发表于 2007-03-09 10:50 |只看该作者
看了freebsd 的man
才知道大小限制在2GB
我的已经超过了2GB了.

论坛徽章:
0
20 [报告]
发表于 2007-03-08 18:29 |只看该作者
原帖由 kuaizaifeng 于 2007-3-8 16:58 发表
是不是mmap中传入的大小和你的本机的文件的大小不一样阿
试着现fstat那个文件的大小,然后用这个数值在mmap试试看

mmap的大小可以跟文件大小不同,在一般情况下,往往mmap映射的长度都比文件本身大0到一个页面的大小

论坛徽章:
0
19 [报告]
发表于 2007-03-08 18:26 |只看该作者
原帖由 ruknow 于 2007-3-8 17:53 发表
正在看这个


Figure 15.30. System limits that affect shared memory Description
Typical values

FreeBSD 5.2.1
Linux 2.4.22
Mac OS X 10.3
Solaris 9

The maximum size in bytes of a sh ...

这个是系统V的共享内存限制吧?

论坛徽章:
0
18 [报告]
发表于 2007-03-08 17:53 |只看该作者
正在看这个


Figure 15.30. System limits that affect shared memory Description
Typical values

FreeBSD 5.2.1
Linux 2.4.22
Mac OS X 10.3
Solaris 9

The maximum size in bytes of a shared memory segment
33,554,432
33,554,432
4,194,304
8,388,608

The minimum size in bytes of a shared memory segment
1
1
1
1

The maximum number of shared memory segments, systemwide
192
4,096
32
100

The maximum number of shared memory segments, per process
128
4,096
8
6

论坛徽章:
0
17 [报告]
发表于 2007-03-08 17:51 |只看该作者
那我老老实实的把大小减小一点.

论坛徽章:
0
16 [报告]
发表于 2007-03-08 17:41 |只看该作者
应该是太大了,用户层一共只有3G的虚拟地址空间,在3G中还要有应用程序自身镜像,有动态库等等,剩下的空间要找2.8G以上的连续空间,我觉得是很玄。

论坛徽章:
0
15 [报告]
发表于 2007-03-08 17:38 |只看该作者
mmap 不能处理两三G文件?
还是系统限制了共享内存的大小?

论坛徽章:
0
14 [报告]
发表于 2007-03-08 17:00 |只看该作者
原帖由 kuaizaifeng 于 2007-3-8 16:58 发表
是不是mmap中传入的大小和你的本机的文件的大小不一样阿
试着现fstat那个文件的大小,然后用这个数值在mmap试试看


一样的,我比对过文件的大小.
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP