Python sysv-ipc共享内存操作示例及权限、已存在报错处理
SysV IPC共享内存跨进程读写实现及报错解决方案
报错原因拆解
- 首次
PermissionsError权限错误:你传入的mode=666是十进制数值,SysV IPC的权限位要求传入八进制数值,十进制666对应八进制为1232,完全不符合预期的读写权限规则,因此创建完成后当前进程也没有权限附加访问。 - 二次
ExistentialError已存在错误:你使用的IPC_CREX标记逻辑为「仅当共享内存不存在时创建,已存在则直接抛出错误」,第一次运行虽然权限校验失败,但共享内存对象已经被内核创建留存,因此第二次运行直接触发已存在报错。
问题修复方案
首先清理已创建的错误共享内存段:
执行命令
ipcs -m查看当前系统所有SysV共享内存段,找到key对应你设置值的段,执行ipcrm -M [对应key的十六进制值]即可删除残留段。
代码参数修正:权限位改为八进制格式,即mode=0o666。
完整跨进程读写示例
写进程(负责创建共享内存)
import sysv_ipc # 共享内存标识key,所有读写进程需要保持一致 SHM_KEY = 9001 # 共享内存最大容量 SHM_SIZE = 9999 try: # IPC_CREAT标记含义:不存在则创建,已存在则直接打开 shm = sysv_ipc.SharedMemory(SHM_KEY, mode=0o666, size=SHM_SIZE, flags=sysv_ipc.IPC_CREAT) except sysv_ipc.ExistentialError: # 兼容已存在场景直接打开 shm = sysv_ipc.SharedMemory(SHM_KEY, mode=0o666) # 写入字节数据,注意不要超过设置的容量大小 write_data = b"test data from writer process" shm.write(write_data) # 测试阶段可以在此处阻塞进程,等待读进程读取完成后再退出 # input("按回车键结束并销毁共享内存:") # 不需要留存共享内存时手动调用remove销毁,否则会一直留存在内核中 # shm.remove()
读进程(负责读取共享内存)
import sysv_ipc SHM_KEY = 9001 SHM_SIZE = 9999 # 直接打开已创建的共享内存 shm = sysv_ipc.SharedMemory(SHM_KEY, mode=0o666) # 读取数据并去除末尾空字节 read_data = shm.read(SHM_SIZE).rstrip(b'\x00') print(f"读取到共享内存内容:{read_data.decode()}")
注意事项
- SysV共享内存不会随进程退出自动销毁,不需要使用时必须调用
shm.remove()或者ipcrm命令手动清理,避免占用内核资源 - 多进程并发读写场景建议配合SysV信号量做读写同步,避免出现数据不一致问题
IPC_CREX仅适合首次独占创建的场景,常规读写逻辑不需要添加该标记
内容的提问来源于stack exchange,提问作者Yin
相关产品推荐
相关产品推荐

