mmap函数实现共享内存

mmap将一个文件或者其他对象映射进内存。mmap也可以实现共享内存。mmap函数调用使得进程之间通过映射同一个文件实现共享内存。文件被映射到进程地址空间后,进程可以像读写内存一样对文件进行操作。

函数原型:void* mmap(void* addr,size_t length,int prot,int flags,int fd,off_t offset);

addr:映射区的开始地址,设置为0时表示系统决定映射区的起始地址

length:映射区的长度。长度单位为字节

prot:期望的内存保护标志。取以下几个值:

PORT_EXEC:页内容可以被执行   PORT_READ:页内容可以被读取

PORT_WRITE:页内容可以被写入  PROT_NONE:页内容不可访问

flag:指定映射对象的类型,映射选项与映射页是否可以共享。

MAP_SHARED:与其他所有映射这个对象的进程共享映射空间。

MAP_PRIVATE:建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原文件。

MAP_FIXED :使用指定的映射起始地址,如果由start和len参数指定的内存区重叠于现存的映射空                                      间,重叠部分将会被丢弃。如果指定的起始地址不可用,操作将会失败。

fd: 有效的文件描述符。返回,由一般open()函数,其值可以设置为-1.此时需要指定flags参数为                         MAP_ANON,表明进行的是匿名映射。

offset:被映射对象内容的起点。

返回值:成功,返回被映射区的指针;失败,返回-1.

时间: 2024-08-17 06:28:06

mmap函数实现共享内存的相关文章

(转)mmap和shm共享内存的区别和联系

共享内存的创建 根据理论: 1. 共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件 (特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现.应用接口和原理很简单,内部机制复杂.为了实现更安全通信,往往还与信号 灯等同步机制共同使用. mmap的机制如:就是在磁盘上建立一个文件,每个进程存储器里面,单独开辟一个空间来进行映射.如果多进程的话,那么不会对实际的物理存储器(主存)消耗太大.

linux共享内存之mmap

这应该可以算得上是IPC的一种,虽然效率可能并没有其它IPC方式高. 看到map很容易联想到映射.的确,mmap就是一种映射方式,将打开的文件和一段连续的内存做映射.使得对内存进行操作即可以实现对文件的读写,反过来,也就是说,可以通过这种方式来达到进程通信. mmap系列涉及三个函数. void * mmap(void *buf, size_t len, int prot, int flag, int fd, off_t offset); 此函数建立一个共享内存,prot即为权限,可选值有PRO

使用mmap可以方便地添加共享内存

使用mmap添加的共享内存. 局限: 只能在有亲属关系的进程之间使用. #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/mman.h> #include <string.h> #include <wait.h> //#include <sys/types.h> //#include <sys/stat.h> //#

Linux环境编程之共享内存区(二):Posix共享内存区

现在将共享内存区的概念扩展到将无亲缘关系进程间共享的内存区包括在内.Posix提供了两种在无亲缘关系进程间共享内存区的方法: 1.内存映射文件:由open函数打开,由mmap函数把得到的描述符映射到当前进程地址空间中的一个文件.(上一节就是这种技术) 2.共享内存区对象:由shm_open打开一个Posix名字(也许是在文件系统中的一个路径名),所返回的描述符由mmap函数映射到当前进程的地址空间.(本节内容) Posix共享内存区涉及以下两个步骤要求: 1.指定一个名字参数调用shm_open

细说linux IPC(五):system V共享内存

system V共享内存和posix共享内存类似,system V共享内存是调用shmget函数和shamat函数.           shmget函数创建共享内存区,或者访问一个存在的内存区,类似系统调用共享内存的open和posix共享内存shm_open函数.shmget函数原型为: #include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg); key: 函

Posix共享内存

Posix共享内存涉及以下两个步骤: 1.指定一个名字参数调用shm_open,以创建以一个新的共享内存区对象或打开一个已存在的共享内存区对象. 2.调用mmap把这个共享内存区映射到调用进程的地址空间. 头文件: #include<sys/mman.h> #include<sys/stat.h> #include<fcntl.h> int shm_open(const char *name, int oflag, mode_t mode); int shm_unlin

通过共享内存进行进程间通信

共享内存的工作方式 顾名思义,共享内存让一段内存可供多个进程访问.用特殊的系统调用(即对 UNIX 内核的请求)分配和释放内存并设置权限:通过一般的读写操作读写内存段中的数据. 共享内存并不是从某一进程拥有的内存中划分出来的:进程的内存总是私有的.共享内存是从系统的空闲内存池中分配的,希望访问它的每个进程连接它.这个连接过程称为映射,它给共享内存段分配每个进程的地址空间中的本地地址. 假设在同一系统上有两个进程 A 和 B 正在运行(见 图 1),它们可以通过共享内存进行协作和共享信息.在图中

IPC_共享内存

在IPC(InterProcess Communication)的通信模式下,不管是使用消息队列还是共享内存,甚至是信号量,每个IPC的对象(object)都有唯一的名字,称为“键”(key).通过“键”,进程能够识别所用的对象.“键”与IPC对象的关系就如同文件名称之于文件,通过文件名,进程能够读写文件内的数据,甚至多个进程能够共用一个文件.而在IPC的通讯模式下,通过“键”的使用也使得一个IPC对象能为多个进程所共用. Linux系统中的所有表示System V中IPC对象的数据结构都包括一

Linux共享内存(一)

inux系统编程我一直看 <GNU/LINUX编程指南>,只是讲的太简单了,通常是书和网络上的资料结合着来掌握才比较全面 .在掌握了书上的内容后,再来都其他资料 . 原文链接 http://www.cnblogs.com/skyme/archive/2011/01/04/1925404.html 共享内存是系统出于多个进程之间通讯的考虑,而预留的的一块内存区.在/proc/sys/kernel/目录下,记录着共享内存的一些限制,如一个共享内存区的最大字节数shmmax,系统范围内最大共享内存区