C++ 创建内存块 Python读取内存块

经过各种折腾,终于搞定了这个奇葩需求:

首先来看 c++文件创建一个内存块服务端客户端分别如下:

//#include "stdafx.h"
#include <windows.h>
#include <iostream> 
using namespace std;
 
#define BUF_SIZE 4096
 
int main()
{
	// 定义共享数据
	UINT32 szBuffer[] = {0x34ff,0x12ff,0x0345678,0x04,0x00,0,0,0};
 
	// 创建共享文件句柄 
	HANDLE hMapFile = CreateFileMapping(
		INVALID_HANDLE_VALUE,   // 物理文件句柄
		NULL,   // 默认安全级别
		PAGE_READWRITE,   // 可读可写
		0,   // 高位文件大小
		BUF_SIZE,   // 低位文件大小
		"S_ME"   // 共享内存名称
	);
 
	// 映射缓存区视图 , 得到指向共享内存的指针
	LPVOID lpBase = MapViewOfFile(
		hMapFile,            // 共享内存的句柄
		FILE_MAP_ALL_ACCESS, // 可读写许可
		0,
		0,
		BUF_SIZE
	);
 
	// 将数据拷贝到共享内存
	//strcpy((UINT32*)lpBase, szBuffer);
	memcpy((UINT32*)lpBase, szBuffer,sizeof(szBuffer));
	cout <<"服务:"<< (UINT32*)lpBase << endl;
 
	// 线程挂起等其他线程读取数据
	Sleep(2000000);
 
	// 解除文件映射
	UnmapViewOfFile(lpBase);
	// 关闭内存映射
  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现Python读取和操作C语言中的共享内存,可以使用Python的ctypes库。ctypes库允许Python与C语言进行交互,并提供了访问共享内存的功能。 首先,需要在C语言中创建一个共享内存,并将其映射到一个文件句柄。这可以使用C语言的库函数来完成,比如shmget()和shmat()。在获得共享内存的指针后,可以将其转换为Python的ctypes中的指针类型(ctypes.c_void_p)。 在Python中,可以使用ctypes库来加载C语言动态链接库,并定义C语言中的结构体和函数原型。通过指定共享内存的指针类型,可以将共享内存映射到Python中的内存空间。 然后,可以使用ctypes访问共享内存的数据。可以根据C语言中定义的数据结构,在Python创建相应的ctypes结构体,并使用共享内存的指针获得数据。通过对ctypes结构体成员变量的访问,可以读取和操作共享内存中的数据。 在使用共享内存操作完成后,需要确保正确地解除共享内存的映射和释放资源。在C语言中,可以使用shmdt()函数将共享内存与进程分离。在Python中,可以使用ctypes库的相应函数释放内存空间。 总结来说,要实现Python读取和操作C语言中的共享内存,需要使用ctypes库加载C语言动态链接库,并定义C语言中的数据结构和函数原型。然后,通过共享内存的指针类型将共享内存映射到Python中,并使用ctypes结构体访问共享内存的数据。最后,在完成操作后,需要及时解除共享内存的映射和释放资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值