进程间通信——共享内存

目录

共享内存说明

特别提醒: 共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如信号量。

共享内存实现一般分为两个步骤:
第一步:创建共享内存,用 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

总结

优点:我们可以看到使用共享内存进行进程之间的通信是非常方便的,而且函数的接口也比较简单,数据的共享还使进程间的数据不用传送,而是直接访问内存,加快了程序的效率。
缺点:共享内存没有提供同步机制,这使得我们在使用共享内存进行进程之间的通信时,往往需要借助其他手段来保证进程之间的同步工作。

上一篇:Oracle调整SGA大小的过程


下一篇:通过Jenkins调用api设置Kong的权重不正确日志中出现no memory