1.概述
对于非亲缘关系的进程间使用共享内存的方式进行通信一般有两种情况:
1.内存映射文件
2.共享内存区对象
对于内存映射文件来说,参考mmap详解,其一般步骤为:
fd = open()
ptr= mmap(fd,...)
对于后者来说,其一般步骤为:
1.创建或打开一个新的共享内存区对象(
shm_open())
2.用mmmp将这个文件映射到调用进程的空间。
共享内存区对象这个抽象的概念,创建于虚拟文件系统,通常挂在/dev/shm目录中,当我们创建一个共享内存区对象后,可以直接ls /dev/shm查看。
2.Posix共享内存编程
涉及的函数不多,但是非亲缘关系的进程间进行通信,则要考虑同步问题。
shm_open()、shm_unlink()
创建和删除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
#include <sys/mman.h>
#

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

被折叠的 条评论
为什么被折叠?



