MacOS下Xcode开发C程序fopen返回Operation not permitted问题咨询
问题根因
MacOS在Unix文件权限之上额外加了TCC(透明权限控制)层,同时Xcode调试启动的进程权限继承自Xcode本身,仅修改Unix文件权限、关闭App Sandbox无法绕过这两层限制,是EPERM(errno=1,Operation not permitted)报错的核心原因。
分步解决
- 先确认传入
fopen的路径合法性:fopen不会自动解析路径中的~家目录符号,直接传~/test.txt这类路径会触发异常,需要先用getenv("HOME")拼接完整绝对路径,或用wordexp做路径展开后再传入。 - 确认目标文件位置:
~/Desktop、~/Documents、~/Downloads、~/Library、外接存储、iCloud同步目录、网络挂载盘均属于TCC默认受保护目录,这类目录下的文件即使权限设为777,未获得TCC授权的进程也无法读取。 - 临时调试场景修复:打开系统设置>隐私与安全性>全磁盘访问,将Xcode.app加入允许列表,完全重启Xcode后再运行代码即可。Xcode调试启动的C程序会继承Xcode的TCC权限,单独给编译产物加权限不生效。
- 沙盒关闭有效性校验:很多场景下仅在Xcode界面关闭App Sandbox未实际生效,打开终端执行以下命令校验编译产物的权限配置:
如果输出结果中codesign -d --entitlements - /path/to/your/compiled/binarycom.apple.security.app-sandbox值为true,说明沙盒未正确关闭,需要检查对应target的所有构建配置(Debug/Release)下的沙盒开关,不要误改其他扩展target的配置。 - 硬化运行时权限修复:如果开启了Hardened Runtime(硬化运行时),默认会限制文件系统访问,可在target的Signing & Capabilities配置页,根据实际访问需求添加对应权限:
- 访问下载目录文件:添加
com.apple.security.files.downloads.read-only权限 - 访问用户主动选择的文件:添加
com.apple.security.files.user-selected.read-only权限
不需要切换到Swift开发,纯C工程可直接调用CoreFoundation接口申请权限、持久化安全范围书签,实现正式版的无弹窗文件访问。
- 访问下载目录文件:添加
快速验证
将Xcode编译出的二进制直接拖到终端运行,如果终端下可以正常打开文件、Xcode调试时不行,即可确定是Xcode本身未获得TCC全磁盘访问权限导致的问题。
内容的提问来源于stack exchange,提问作者David Gilbert
相关产品推荐
相关产品推荐

