对接数据生产者消费者_Linux进程通信之共享内存实现生产者/消费者模式

本文介绍了如何使用Linux的共享内存实现生产者消费者模式,包括shmget、shmat、shmdt和shmctl等系统调用的使用。生产者将数据存入共享内存的缓冲池,消费者从缓冲池取出数据,通过信号量实现对缓冲池的互斥访问,以解耦和并发处理数据。
摘要由CSDN通过智能技术生成

共享内存

共享内存是内核为进程创建的一个特殊内存段,它将出现在进程自己的地址空间中,其它进程可以将同一段共享内存连接(attach)到自己的地址空间。这是最快的进程间通信方式,但是不提供任何同步功能(需要我们信号量实现)。

2d4cf63fd2945fb160d8a0a35f51e700.png

使用共享内存实现生产者消费者任务模式。

共享内存系统调用

#include #include#include

int semget(key_t key, int size, intflag);void *shmat(int shmid, void *addr, intflag);int shmdt(void *addr);int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmget函数:

功能:获得或创建一个共享内存标识符。

int semget(key_t key, size_t size, int shmflag);

成功返回一个共享内存标识符,失败返回-1;

第一个参数key为共享内存段命名(一般由ftok产生);

第二个参数size为需要共享的内存容量。(如果共享内存已存在时,不能不大于该共享内存段的大小);

第三个参数设置访问权限(低9位)与IPC_CREAT, IPC_EXCL 的按位或。

shmat函数

功能:将共享内存段连接到一个进程的地址空间中。

void *shmat(int shm_id, const void *addr, int shmflg) ;

成功返回共享存储段连接的实际地址,失败返回-1

第一个参数shm_id为shmget返回的共享内存标识符。

第二个参数addr指明共享内存段要连接到的地址(进程空间内部地址),通常指定为空指针,表示让系统来选择共享内存在进程地址空间中出现的地址。

第三个参数shmflg可以设置为两个标志位(通常设置为0)

SHM_RND( 表示第二个参数指定的地址应被向下靠拢到内存页面大小的整数倍)

SHM_RDONLY,要连接的共享内存段是只读的。

shmdt函数

功能:将共享内存从当前进程中分离。

int shmdt(const void *shmaddr) ; //其中shmaddr为shmat返回的地址。

shmctl函数

功能:查看及修改共享内存段的shmid_ds结构,删除该结构以及相连的共享存储段标识。

int shmctl(int shm_id, int command, struct shmid_ds *buf) ;

成功返回0,失败返回-1

第二个参数commad取值:

IPC_STAT 获取当前共享内存段的shmid_ds结构

IPC_SET 把共享内存段

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值