进程间通信(IPC)4 ------ 共享内存(配合使用信号量进行同步)

本文介绍了如何在C语言中实现进程间通信(IPC)中的共享内存,通过shmget、shmat、shmdt和shmctl等函数创建、访问和控制共享内存。同时,结合信号量实现读写同步,确保在读取时无法写入,写入时无法读取。示例展示了writer和reader进程如何有效协作,确保数据一致性。
摘要由CSDN通过智能技术生成

      共享内存就是能被不同进程共同访问的一块内存。

      函数shmget()用以创建一个共享内存,或者访问一个已存在的共享内存。原型如下:

#include <linux/shm.h>
int shmget(key_t key, size_t size, int shmflg);

  • 参数key是由ftok()函数或得的键值。
  • 参数size以字节为单位制定内存的大小。创建新的共享内存时,size必须大于0;如果访问一个现存的共享内存,则设置size为0。
  • 参数shmflg是操作标志位。一般为IPC_CREATE。

      通过shmat()函数将共享内存附加到需要使用共享内存的进程的地址空间。这样该进程与共享内存之间就建立了连接。shmat()函数调用成功就会返回一个指向共享内存区的指针,通过该指针就可以访问共享内存区了。shmat函数的原型为:

#include <linux/shm.h>
void * shmat(int shmid, const void *shmaddr, int shmflg);

  • 参数shmid为shmget的返回值。
  • 参数shmaddr一般设为NULL,表示由内核选择一个空闲的内存区。

      当进程结束使用共享内存区时,要通过函数shmdt()断开与共享内存区的连接。一般来说,当一个进程终止时,它所附加的共享内存区都会自动脱落。其原型为:

#include <sys/shm.h>
int shmdt(const void * shmaddr);


      函数shmctl()用以对共享内存区进行控制。

#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值