python和c共享内存数据传输_python和C++共享内存传输图像

本文详细介绍了Python和C++如何通过共享内存进行数据传输,特别是图像数据。文章指出,Python不能直接与C++共享内存交互,需要通过C++打包成库来实现。在Linux中,主要使用shmget、shmat、shmdt和shmctl函数来创建、映射、断开和管理共享内存。在实践中,作者展示了C++如何创建动态库,Python如何调用该库存取图像数据,以及C++如何读取共享内存获取图像。文章强调了每次映射后必须断开映射以避免内存泄漏的问题。

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值