0问题注意
共享内存使用完,例如每次更新一张图像后.
1要断开映射,不然在映射的时候会认为不占用,重新随机映射地址,造成共享内存不停的再增大.
shmdt("名字");
2最后是用完要释放共享内存
shmctl(segment_id, IPC_RMID, 0);
原理
https://zhuanlan.zhihu.com/p/92678653
python没有办法直接和c++共享内存交互,需要间接调用c++打包好的库来实现
流程
1 C++共享内存打包成库
2 python调用C++库往共享内存存图像数据
3 C++测试代码从共享内存读取图像数据
进程间通信的信号量使用与同步
共享内存
在 Linux 实现内存共享的函数主要有 shmget、shmat、shmdt、shmctl 这么四个。
1、shmget 得到或者创建 一个共享内存对象
int shmget(key_t key, size_t size, int shmflg)
其中 key_t key 的值为一个IPC键值,可以通过IPC_PRIVATE 建立一个新的键值为0的共享对象 ,但这并不能保证与IPC对象的对应关系,不同进程之间需要同一个且不会重复的IPC键值来完成通信,一般此参数使用ftok函数来进行创建IPC键值。
size_t size 是映射共享内存的大小,单位为字节 (Byte),但在创建时这里的最小分配单位是一页,大致为4KB,当你超过4KB但是小于8KB时会主动分配两页,也就是不足一页(4KB)的按照一页计算。
int shmflg 参数是需要注明的操作模式。
0:取键值对应的共享内存,若此键值相应的共享内存不存在就报错。
IPC_CREAT:存在与键值对应的共享内存则返回标识符,若不存在则创建共享内存返回标识符。
IPC_CREAT|IPC_EXCL:不存在相应键值的共享内存则创建此共享内存,若存在则报错
返回值:成功返回共享内存的标识符,失败返回-1。
2、shmat 获得共享内存的地址(与进程建立映射)
void *shmat(int shmid, const void *shmaddr, int shmflg)
int shmid 接收一个共享内存标识符参数,通常由 shmget 返回。
const void *shmaddr 共享内存地址映射到进程哪块内存地址,若设 NULL 则让内核决定。
int shmflg 选择操作模式,设 SHM_RDONLY 为只读共享内存,其他或0为可读写。
返回值:成功返回映射完成的内存地址,失败返回-1。
3、shmdt 与进程断开映射关系
int shmdt(const void *shmaddr)
const void *shmaddr 在进程中用于映射内存地址的指针。
返回值:成功返回0,失败返回-1。
4、shmctl 管理共享内存(释放共享内存)
int shmctl(int shmid, int cmd, struct shmid_ds *buf)
int shmid 接收一个共享内存标识符参数,通常由 shmget 返回。
int cmd 是需要注明的操作模式。
IPC_STAT:获取共享内存状态,将共享内存的 shmid_ds 信息拷贝到 shmid_ds *buf 中。
IPC_SET:更改共享内存状态,将 shmid_ds *buf 所指内容拷贝到共享内存 shmid_ds 中。
IPC_RMID:删除释放这块共享内存。
struct shmid_ds *buf 内存管理结构体,这个结构在 shm.h 中定义,网上能查到信息。
返回值:成功返回0,失败返回-1。
实际使用
使用 shmge