Swift调用shm_open提示可变参数函数不可用,是否有替代方案?
Swift中shm_open调用问题解决方案
问题原因
- shm_open本身是系统支持的函数,并非不可用。你遇到的
Variadic function is unavailable报错,是因为该函数在C标准中声明为可变参数函数,Swift默认不支持直接调用C可变参数函数。 - shm_unlink可以正常调用是因为它是固定参数函数,Swift可以直接导入使用。
- 你给出的调用代码还缺失必传参数:当传入
O_CREAT标志时,必须传入第三个权限位mode参数,否则C层面调用也会出现未定义行为。
可用解决方案
方案1:封装C辅助函数(最稳妥,推荐)
你已经有C语言实现,可以直接把shm_open的调用封装成固定参数的C函数暴露给Swift调用,步骤如下:
- 新建C头文件
shm_helper.h,写入导出声明:
#ifndef shm_helper_h #define shm_helper_h #include <sys/types.h> int create_shm(const char* name, int oflag, mode_t mode); #endif /* shm_helper_h */
- 新建C实现文件
shm_helper.c,实现逻辑:
#include "shm_helper.h" #include <sys/mman.h> int create_shm(const char* name, int oflag, mode_t mode) { return shm_open(name, oflag, mode); }
- 项目配置:
- Xcode项目:将头文件加入到Swift桥接头文件中
- Swift Package Manager:将两个文件加入对应目标,头文件放到
publicHeadersPath指定的目录下
- Swift侧调用示例:
import Darwin let fd = create_shm("/myregion", O_CREAT | O_RDWR, 0o644) guard fd >= 0 else { perror("create_shm failed") exit(EXIT_FAILURE) } // 后续正常使用fd进行mmap等操作
方案2:使用苹果原生IOSurface框架(苹果平台推荐)
如果是开发苹果生态(macOS/iOS/tvOS等)的应用,更推荐使用系统原生的IOSurface框架实现跨进程共享内存,兼容性更强,还支持图形相关的共享场景,也可以直接获取到用于映射的文件描述符。
补充
如果只是同进程内使用、不需要跨进程共享,也可以直接调用mmap使用匿名映射,不需要创建共享内存文件描述符。
内容的提问来源于stack exchange,提问作者TornadoHell
相关产品推荐
相关产品推荐

