免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2208 | 回复: 9

[函数] mmap是否不能映射新建文件? [复制链接]

论坛徽章:
0
发表于 2016-01-21 10:50 |显示全部楼层
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>       //字符串控制定义
  4. #include <fcntl.h>        //文件控制定义
  5. #include <sys/mman.h>     //mmap

  6. int main(int argc, char **argv)
  7. {
  8.     int iFd=0;
  9.     unsigned char *pMap=NULL;
  10.     unsigned char *p=NULL;
  11.     unsigned long dwFileBytes=16338;
  12.     unsigned long  i;
  13.     unsigned char ucResult=0;
  14.    
  15.     iFd=open("./temp123.tmp", O_CREAT|O_RDWR);
  16.     if (iFd<=0)
  17.     {
  18.         printf("Open file failed\n");
  19.         ucResult=1;
  20.         goto End;
  21.     }
  22.     printf("1111111\n");

  23.     pMap=mmap(NULL, dwFileBytes, PROT_READ|PROT_WRITE, MAP_SHARED, iFd, 0);
  24.     if (!pMap)
  25.     {
  26.         ucResult=2;
  27.         goto End;
  28.     }
  29.     printf("pMap=%p\n",pMap);

  30.     for(p=pMap,i=0; i<5; i++)
  31.         *p++=0;
  32.    
  33.     printf("2222222\n");

  34. End:
  35.     if (!pMap)
  36.         munmap(pMap, dwFileBytes);
  37.     if (iFd>0)
  38.         close(iFd);
  39.    
  40.     return ucResult;
  41. }
复制代码
编了一个简单的测试代码,发现每次运行到printf("pMap=%p\n",pMap);之后就出现“总线错误”,试过映射已存在文件,就无此问题,分析了下,好像mmap映射新建文件并不会按照映射大小来扩充文件大小,即上面例子中pMap指向的内存实际为空,那若像实现此功能应该如何操作呢?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
发表于 2016-01-21 11:44 |显示全部楼层
哥,你文件都没有16338这么大,你怎么可以mmap呢。

论坛徽章:
0
发表于 2016-01-21 13:41 |显示全部楼层
本帖最后由 rollin7 于 2016-01-21 13:45 编辑

回复 2# linux_c_py_php
我现在想问的就是这个问题,在windows下用 CreateFileMapping,哪怕是新建文件,会自动按照Mapping的字节来扩充文件大小,方便实现文件的复制

实际上用mmap也就是想实现文件的快速加密解密,特别是大文件,如果mmap不可行,就只能考虑通过申请缓冲区用fread/fwrite来实现了

论坛徽章:
0
发表于 2016-01-21 14:27 |显示全部楼层
回复 2# linux_c_py_php
仔细查了一下,网上确实有些说法是

在使用过程中应该注意的地方:
1). 最终被映射文件的内容的长度不会超过文件本身的初始大小,即映射不能改变文件的大小;
2). 可以用于进程通信的有效地址空间大小大体上受限于被映射文件的大小,但不完全受限于文件大小。


但一直没找到官方的明确说法。

看来确实和Windows下的机制不一样,用另外的办法吧


   

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2016-01-21 16:00 |显示全部楼层
新建文件,先扩展到指定长度,而已存在文件,先查询出文件长度,再用此确定长度来映射不就结了。

论坛徽章:
0
发表于 2016-01-21 17:49 |显示全部楼层
回复 5# 爻易

既然需要先用其它方法扩展文件,我又何必再用mmap, 在扩展文件时就写入需要的数据了。
   

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2016-01-21 18:30 |显示全部楼层
回复 6# rollin7

你的问题就是映射如何操作呀。

   

论坛徽章:
277
射手座
日期:2013-08-23 12:04:38射手座
日期:2013-08-23 16:18:12未羊
日期:2013-08-30 14:33:15水瓶座
日期:2013-09-02 16:44:31摩羯座
日期:2013-09-25 09:33:52双子座
日期:2013-09-26 12:21:10金牛座
日期:2013-10-14 09:08:49申猴
日期:2013-10-16 13:09:43子鼠
日期:2013-10-17 23:23:19射手座
日期:2013-10-18 13:00:27金牛座
日期:2013-10-18 15:47:57午马
日期:2013-10-18 21:43:38
发表于 2016-01-21 19:33 |显示全部楼层
rollin7 发表于 2016-01-21 17:49
回复 5# 爻易

既然需要先用其它方法扩展文件,我又何必再用mmap, 在扩展文件时就写入需要的数据了。


truncate 指定长度,生成一个空洞文件

论坛徽章:
0
发表于 2016-01-22 08:40 |显示全部楼层
本帖最后由 rollin7 于 2016-01-22 08:52 编辑

回复 7# 爻易

恩,谢谢,之前不知道有命令可以直接扩展,以为要用fwrite之类的来填充,误会了,
   

论坛徽章:
0
发表于 2016-01-22 08:40 |显示全部楼层
本帖最后由 rollin7 于 2016-01-22 09:01 编辑

回复 8# hellioncu

恩,谢谢你告诉的函数,已经试过了,没问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

SACC2019中国系统架构师大会

【数字转型 架构演进】SACC2019中国系统架构师大会,8.5折限时优惠重磅来袭!
2019年10月31日~11月2日第11届中国系统架构师大会(SACC2019)将在北京隆重召开。四大主线并行的演讲模式,1个主会场、20个技术专场、超千人参与的会议规模,100+来自互联网、金融、制造业、电商等领域的嘉宾阵容,将为广大参会者提供一场最具价值的技术交流盛会。

限时8.5折扣期:2019年9月30日前


----------------------------------------

大会官网>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP