本项目使用共享内存来进行进程间通信。
**划重点:**学习Linux的进程间通信(不局限于进程间通信),我们应该站在Linux内核的角度去看待。
皮毛都不怎么懂,我还需努力。
文章目录
01 管道/消息队列传递数据与用共享内存传递数据比较
001 用管道/消息队列传递数据
如上图需要四步:
(1)服务器读文件;
(2)服务器把数据给内核,内核缓存下来;
(3)客户端从内核中取数据;
(4)客户端写文件。
002 用共享内存传递数据
共享内存
进程像使用自己的堆区,栈区一样使用内核
(1)服务器把文件拷贝到共享内存
(2) 客户端直接从共享内存拿数据
所以共享内存是最快的IPC 进程间通信方式
02 共享内存理论知识
这块不是重点: 直接去linux 使用man指令观看
共享内存:是被多个进程共享的一部分物理内存,共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以理解看到其中的内容。
共享内存实现实现分为两个步骤:
一:创建共享内存,使用shmget函数
二:映射共享内存,将这段创建的共享内存映射到具体的进程空间去,使用shmat函数
创建:
int shmget(key_t key,int size,int shmflg)
key标识共享内存的键值:0/IPC_PRIVATE。当key的取值为IPC_PRIVATE,则函数shmget()将创建一个新的共享内存;如果key的取值为0,而参数shmflg中又设置IPC_PRIVATE这个标志,则同样会创建一块新的共享内存。
返回值:如果成功则返回内存标识符,如果失败则返回-1;
映射:
int shmat(int shmid, char *shmaddr,int flag)
参数:
shmid:shmget函数返回的共享内存存储标识符
flag:决定以后用什么方式来确定映射地址(通常为0)
返回值:
如果成功,则返回共享内存到进程中的地址;如果失败,则返回-1
一个进程不再需要共享内存时,需要把它从进程地址空间中脱离。
03 样例
我们直接上代码:
```cpp
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/ipc.h>