共享内存

共享内存是IPC最快的方式。一旦这种方式映射到共享它的进程地址空间,这些进程间的数据传递就不在涉及内核。管道、FIFO、System V消息队列的read、msgrcv、write和msgsnd都涉及从进程与内核的数据复制。

​共享内存操作函数:

1、系统调用mmap()   

void* mmap ( void * addr , size_t len , int prot , int flags , int fd , off_t offset )

mamap函数把一个文件或一个Posix共享内存区对象映射到调用进程的地址空间。

参数fd为即将映射到进程空间的文件描述字,一般由open()返回,同时,fd可以指定为-1,此时须指定flags参数中的MAP_ANON,表明进行的是匿名映射(不涉及具体的文件名,避免了文件的创建及打开,很显然只能用于具有亲缘关系的进程间通信)。

len是映射到调用进程地址空间的字节数,它从被映射文件开头offset个字节开始算起。prot 参数指定共享内存的访问权限。

可取如下几个值的或:PROT_READ(可读) , PROT_WRITE (可写), PROT_EXEC (可执行), PROT_NONE(不可访问)。

flags由以下几个常值指定:MAP_SHARED , MAP_PRIVATE , MAP_FIXED,其中,MAP_SHARED , MAP_PRIVATE必选其一,而MAP_FIXED则不推荐使用。

offset参数一般设为0,表示从文件头开始映射。

参数addr指定文件应被映射到进程空间的起始地址,一般被指定一个空指针,此时选择起始地址的任务留给内核来完成。函数的返回值为最后文件映射到进程空间的地址,进程可直接操作起始地址为该值的有效地址。

2、系统调用munmap()   

int munmap( void * addr, size_t len )

munmap函数从某个进程的地址空间中删除一个映射关系。addr是调用mmap()时返回的地址,len是映射区的大小。当映射关系解除后,对原来映射地址的访问将导致段错误发生。

3、系统调用msync()   

int msync ( void * addr , size_t len, int flags)

一般说来,进程在映射空间的对共享内容的改变并不直接写回到磁盘文件中,往往在调用munmap()后才执行该操作。可以通过调用msync()实现磁盘上文件内容与共享内存区的内容一致。

posted @ 2016-11-27 14:22  luizp  阅读(114)  评论(0编辑  收藏  举报