Linux 多线程编程( POSIX )( 六 )----->共享内存区
来源:互联网 发布:javascript基础教程 编辑:程序博客网 时间:2024/05/21 21:41
Attention:打开相关代码区
1. 介绍
POSIX 共享内存和SYSTEMV的共享内存的框架是差不多的,细节有区别!
在前面的SYSTEM V的共享内存区我们已经知道共享内存区是最快的IPC形式!
例如在两个进程之间传输data,那么此方法将会是非常高效的!、
共享内存是由IPC为一个进程创建的一个特殊的地址范围,它将出现在进程的地址
空间中。其他进程可以把同一段共享内存段“连接到”它们自己的地址空间里去。所
有进程都可以访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所
做的改动会立刻被有访问同一段共享内存的其他进程看到。
但是我们知道同时可以有多个进程访问,那么要控制一段时间内只能有一个,所以
为了同步,那么必须要用到前面的信号量,互斥量,条件量之类的可以同步的机
制!
2. mmap函数:
mmap函数把一个文件或一个POSIX共享内存区对象映射到调用进程的地址空间。使
用该函数的目的:
>: 1.使用普通文件以提供内存映射I/O
>: 2.使用特殊文件以提供匿名内存映射。
>: 3.使用shm_open以提供无亲缘关系进程间的Posix共享内存区。
#include<sys/mman.h>
void * mmap(void * addr, size_t len, int prot, int flag, int filedes, off_t off)
参数:
addr 指向映射存储区的起始地址
len 映射的字节
prot 对映射存储区的保护要求
flag flag标志位
filedes 要被映射文件的描述符
off 要映射字节在文件中的起始偏移量
若成功则返回映射区的起始地址,若出错则返回MAP_FAILED
注意:
>: addr参数用于指定映射存储区的起始地址。通常将其设置为NULL,这表示由系
统选择该映射区的起始地址。
>: prot参数说明对映射存储区的保护要求。可是PROT_READ(映射区可
读),PROT_WRITE(映射区可写),PROT_EXEC(映射区可执行)任意组合的按位
或,也可以是PROT_NONE(映射区不可访问)。对指定映射存储区的保护要求不
能超过文件open模式访问权限。
>: flag参数影响映射区的多种属性:
>:MAP_FIXED: 返回值必须等于addr.因为这不利于可移植性,所以不鼓励使用此标
志。
>:MAP_SHARED: 这一标志说明了本进程对映射区所进行的存储操作的配置。
此标志指定存储操作修改映射文件。
>:MAP_PRIVATE: 本标志导致对映射区建立一个该映射文件的一个私有副本。所有
后来对该映射区的引用都是引用该副本,而不是原始文件。
要注意的是必须指定MAP_FIXED或MAP_PRIVATE标志其中的一个,指定前者是对存储
映射文件本身的一个操作,而后者是对其副本进行操作。
>: