如何用Python映射与Linux内核共享的内存?解决mmap空文件报错
问题解决:Python映射内核/proc共享内存报错"cannot mmap an empty file"
问题原因
/proc下的虚拟文件并非真实磁盘文件,常规文件大小获取方法(比如os.fstat)会返回0。Python的mmap.mmap函数若第二个参数传0,会自动尝试读取文件大小,得到0后就抛出该错误。而C语言实现时,你大概率是手动指定了映射的具体大小,或者内核模块的proc文件接口在处理mmap请求时已明确内存区域大小,因此能正常工作。
解决方案
1. 手动指定映射大小
你需要明确内核模块中共享内存的实际大小(比如内核定义的共享缓冲区大小,如4096字节、8192字节等),将mmap.mmap的第二个参数从0改为这个具体数值。
修改后的示例代码:
import mmap import os filepath = "/proc/file" # 替换为你内核模块中实际的共享内存大小,示例为4096字节 SHARED_MEM_SIZE = 4096 fd = os.open(filepath, os.O_RDONLY) # 第二个参数传入明确的大小,而非0 mmap_object = mmap.mmap(fd, SHARED_MEM_SIZE, mmap.MAP_SHARED, mmap.ACCESS_READ) txt = mmap_object.read() # 记得关闭资源 mmap_object.close() os.close(fd)
2. 确认内核模块的proc文件mmap实现
确保你的内核模块中,struct file_operations的mmap函数实现正确处理了内存区域的大小和权限,返回有效的内存映射描述,保证用户态能正确完成映射。
内容的提问来源于stack exchange,提问作者Adel Belkhiri
相关产品推荐
相关产品推荐

