主要观点:工作中系统因历史原因使用大量 SystemV 共享内存,有 SysV 和 POSIX 两种共享内存 API,某些受限系统只能用 Python 3.7 且无额外库,作者为方便从 Python 操作共享内存写了简单包装器。
关键信息:
- 介绍了 ctypes 加载库及提取函数指针的方法,如加载 SysV 相关库并设置 shmget 函数参数类型和返回值类型。
- 说明在不同系统上加载库的差异,FreeBSD 中 SysV shmem 在核心库,Linux 可能需调用
LoadLibrary("librt")
。 - 展示了使用 ctypes 操作共享内存的示例,包括创建共享内存段、获取其 ID、附着和分离共享内存、发送消息等,如通过
shmget
创建 1024 字节且可世界读取的共享内存段,shmat
附着共享内存等。 - 定义了
shmrm
函数用于删除共享内存段,还写了一个可创建、读写和删除共享内存段的程序作为实验。
重要细节: - Manpage 中的特殊标志值需深入研究 C 头文件,FreeBSD 中
IPC_PRIVATE
等于 0 较易在 Python 中实现。 - CTypes 中的
c_void_p
类型可从None
创建空指针,可在不同指针类型间转换,操作void *
在 C 和 Python 中都需工作,如通过ctypes.cast
进行类型转换,ctypes.create_string_buffer
可创建内存管理的缓冲区。
总结:ctypes 能在 Python 中方便操作 C 相关的共享内存 API,虽 Python 3.8 起标准库有好的共享内存抽象,但此工具在受限环境中很有用。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。