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