APUE编程:137---进程间通信(mmap、munmap函数)
原创
©著作权归作者所有:来自51CTO博客作者董哥的黑板报的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、函数介绍
#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
//返回值:成功返回目标内存区域的指针;失败返回MAP_FAILED((void*)-1)
int munmap(void *addr, size_t length);
//返回值:成功返回0;失败返回-1并设置errno
- mmap:用于申请一段内存空间。我们可以将这段内存作为进程间通信的共享内存,也可以将文件直接映射到其中
- munmap:释放由mmap创建的这段内存空间
mmap函数
- addr:允许用户使用某个特定的地址作为这段内存的起始地址(如果设置为NULL,则凶自动分配一块地址)
- length:指定内存段的长度
- prot:用来设置内存段的访问权限,它可以取一下几个值的按位或
- PROT_READ:内存段可读
- PROT_WRITE:内存段可写
- PROT_EXEC:内存段可执行
- PROT_NONE:内存段不能被访问
- flags:控制内存段内容被修改后程序的行为,它可以被设置为下表的某些值的按位或(只列出了部分,其中MAP_SHARED和MAP_PRIVATE不能同时指定)
常用值 |
含义 |
MAP_SHARED |
在进程间共享这段内存,对该内存段的修改将反映到被映射的文件中。它提供了进程间共享内存的POSIX方法 |
MAP_PRIVATE |
内存段为调用进程所私有。对该内存段的修改不会反映到被映射的文件中 |
MAP_ANONYMOUS |
这段内存不是从文件映射而来的。其内容被初始化为全0。这种情况下,mmap函数的最后两个参数将被忽略 |
MAP_FIXED |
内存段必须位于addr参数指定的地址处。start必须是内存页面大小(4096字节)的整数倍 |
MAP_HUGETLB |
按照“大内存页面”来分配内存空间。“大内存页面”的大小可通过/proc/meminfo文件来查看 |
- fd:是被映射文件对应的文件描述符。可以通过open调用获得
- offset:设置从文件的何处开始映射