免费注册 查看新帖 |

Chinaunix

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

很简单的匿名映射 但找不到哪里出错。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-04-28 10:42 |只看该作者 |倒序浏览
#include <stdio.h>
#include <sys/mman.h>
#define bufsize (10*1024*1024)
int main(void){
        void *bufbase;
        bufbase=(void *)mmap(0,bufsize,PROT_READ|PROT_WRITE,MAP_ANON|MAP_SHARED,-1,0);
        if(bufbase==MAP_FAILED){
                puts("mmap error");
        }
        printf("%p\n",bufbase);       
        munmap(bufbase,bufsize);
        return 0;
}

很简单的程序 但分配总是不成功 不知道哪里错了。。

论坛徽章:
0
2 [报告]
发表于 2008-04-28 10:58 |只看该作者
我晕 吐掉了  原来是参数问题 apue上写的是MAP_ANON  改成MAP_ANONYMOUS就好了。。。
早知道就不省打那几个字了    也不能迷信apue阿。。

论坛徽章:
0
3 [报告]
发表于 2008-04-28 11:12 |只看该作者
对于父子进程通过匿名映射实现共享内存 我不是很确定
是不是父进程复制给子进程的仅仅是指向匿名映射分配的内存的指针   内存区并不拷贝
父子进程同时有一个指向内存的指针  但都指向同一个内存块?

论坛徽章:
0
4 [报告]
发表于 2008-04-28 11:50 |只看该作者
原帖由 duanius 于 2008-4-28 11:12 发表
对于父子进程通过匿名映射实现共享内存 我不是很确定
是不是父进程复制给子进程的仅仅是指向匿名映射分配的内存的指针   内存区并不拷贝
父子进程同时有一个指向内存的指针  但都指向同一个内存块?


嗯, 是的.
具体可以参考 <UNIX网络编程> 卷2, 进程间通信. 第12章.

论坛徽章:
0
5 [报告]
发表于 2008-04-28 12:28 |只看该作者
惭愧 只看过卷一  谢谢燕姿:)

论坛徽章:
0
6 [报告]
发表于 2008-04-28 13:08 |只看该作者
原帖由 duanius 于 2008-4-28 12:28 发表
惭愧 只看过卷一  谢谢燕姿:)


卷2中的内容其它很多书上也有讲,用到时再查,记得更牢:wink:

论坛徽章:
0
7 [报告]
发表于 2008-04-29 00:58 |只看该作者
用MAP_ANON是正确的啊:
APUE2上也写了:

The anonymous memory-mapping facility is supported by all four platforms discussed in this text. Note, however, that Linux defines the MAP_ANONYMOUS flag for this facility, but defines the MAP_ANON flag to be the same value for improved application portability.

four platforms: 指的是System V/386 Rel 4.2, 4.3+BSD, BSD/386 和 SunOS 4.1.1/4.1.2


Linux(Linux 2.6.23.1-42.fc8 i686)下的/usr/include/bits/mman.h
/* Other flags.  */
#define MAP_FIXED       0x10            /* Interpret addr exactly.  */
#ifdef __USE_MISC
# define MAP_FILE       0
# define MAP_ANONYMOUS  0x20            /* Don't use a file.  */
# define MAP_ANON       MAP_ANONYMOUS
#endif

Solaris 10 的/usr/include/sys/mman.h
#define MAP_FIXED       0x10            /* user assigns address */
#define MAP_NORESERVE   0x40            /* don't reserve needed swap area */
#define MAP_ANON        0x100           /* map anonymous pages directly */
#define MAP_ANONYMOUS   MAP_ANON        /* (source compatibility) */
#define MAP_ALIGN       0x200           /* addr specifies alignment */
#define MAP_TEXT        0x400           /* map code segment */
#define MAP_INITDATA    0x800           /* map data segment */

FreeBSD 6.2 /usr/include/sys/mman.h
/*
* Mapping type
*/
#define MAP_FILE         0x0000 /* map from file (default) */
#define MAP_ANON         0x1000 /* allocated from memory, swap space */

论坛徽章:
0
8 [报告]
发表于 2008-04-29 08:50 |只看该作者
对阿 但我用分配就出错  不知道为什么  难道是缺了啥头文件。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP