目录
共享内存说明
特别提醒: 共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。
共享内存实现一般分为两个步骤:
第一步:创建共享内存,用 shmget() 从内存中获得一段共享内存区域;
第二步:映射共享内存,也就是说把创建的共享内存区映射到进程当中去,这里使用的是 shmat()
第三步:将共享内存从当前进程中分离,这里使用的是shmdat()
第四步:销毁共享内存,使用的是shmctl()
shmget()函数
int shmget(key_t key, size_t size, int shmflg);
头文件 |
<sys/shm.h> |
key |
|
size |
共享内存大小 |
shmflg |
权限标志与open()一样,可与IPC_CREAT做或操作 |
函数返回值 |
成功:共享内存标识符。失败:-1 |
shmat()函数
void *shmat(int shm_id, const void *shm_addr, int shmflg);
头文件 |
<sys/shm.h> |
shm_id |
共享内存标识符 |
shm_addr |
连接到进程的地址位置,一般为空,由系统自行分配 |
shm_flg |
标志位 默认0:可读可写。SHM_RDONLY:可读 |
函数返回 |
成功:被映射的地址。失败:-1 |
shmdt()函数
int shmdt(const void *shmaddr);
头文件 |
<sys/shm.h> |
shmaddr |
shmat返回的地址指针 |
函数返回 |
成功:0 ,失败:-1 |
shmctl()函数
int shmctl(int shm_id,int command,struct shmid_ds *buf);
头文件 |
<sys/shm.h> |
shm_id |
shmget函数返回的共享内存标识符 |
command |
总共三个参数:IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。 IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值。IPC_RMID:删除共享内存段 |
buf |
buf是一个结构指针,它指向共享内存模式和访问权限的结构,设置NULL即可。 |
函数返回 |
成功:0。失败:-1 |
总结
优点:我们可以看到使用共享内存进行进程之间的通信是非常方便的,而且函数的接口也比较简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,加快了程序的效率。
缺点:共享内存没有提供同步机制,这使得我们在使用共享内存进行进程之间的通信时,往往需要借助其他手段来保证进程之间的同步工作。