进程间通信——共享内存

共享内存说明

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

共享内存实现一般分为两个步骤:
第一步:创建共享内存,用 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>
shmaddrshmat返回的地址指针
函数返回成功:0 ,失败:-1

shmctl()函数

int shmctl(int shm_id,int command,struct shmid_ds *buf);       
头文件<sys/shm.h>
shm_idshmget函数返回的共享内存标识符
command总共三个参数:IPC_STAT:把shmid_ds结构中的数据设置为共享内存的当前关联值,即用共享内存的当前关联值覆盖shmid_ds的值。 IPC_SET:如果进程有足够的权限,就把共享内存的当前关联值设置为shmid_ds结构中给出的值。IPC_RMID:删除共享内存段
bufbuf是一个结构指针,它指向共享内存模式和访问权限的结构,设置NULL即可。
函数返回成功:0。失败:-1

总结

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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值