You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 04:36:01