进程间通信笔记(9)—Posix共享内存

本文介绍了非亲缘进程间使用Posix共享内存通信的两种方式,包括内存映射文件和共享内存区对象。详细讲解了shm_open()、shm_unlink()函数以及ftruncate()在调整共享内存大小中的应用。并探讨了客户服务模型下,如何利用Posix信号量和Pthread Mutex实现进程间的同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.概述

对于非亲缘关系的进程间使用共享内存的方式进行通信一般有两种情况:

1.内存映射文件
2.共享内存区对象

对于内存映射文件来说,参考mmap详解,其一般步骤为:

fd = open()
ptr= mmap(fd,...)

对于后者来说,其一般步骤为:

1.创建或打开一个新的共享内存区对象(shm_open()
2.用mmmp将这个文件映射到调用进程的空间。

共享内存区对象这个抽象的概念,创建于虚拟文件系统,通常挂在/dev/shm目录中,当我们创建一个共享内存区对象后,可以直接ls /dev/shm查看。


2.Posix共享内存编程

涉及的函数不多,但是非亲缘关系的进程间进行通信,则要考虑同步问题。

创建和删除IPC对象。

#include <sys/mman.h>
#include <sys/stat.h>        /* For mode constants */
#include <fcntl.h>           /* For O_* constants */
int shm_open(const char *name, int oflag, mode_t mode);

int shm_unlink(const char *name);

Link with -lrt.

关于shm_open的参数
第二个参数:oflag 可以是 O_CREAT|O_EXCL|O_RDWR(这个套路已经很多次了,如果IPC对象存在,则O_EXCL|O_CREAT会返回一个Segment Fault。
第三个参数:mode 可以是0644

ftruncate函数

调整共享内存区的大小。

#include <unistd.h>
#include <sys/types.h>
int ftruncate(int fd, off_t length);

第一个参数:文件描述符
第二个参数:修改后的大小

客户服务模型

两个进程,共享内存区,客户端不停往buffer里面放东西,服务端输出共享内存区的内容(消费)。两个进程通过Posix共享内存区进行通信,使用Posix信号量和Phtread Mutex进行同步。

头文件

//shm.h
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值