Android平台下C语言open()函数仅支持设置用户级权限的技术咨询
Android平台C语言文件权限设置:open()的局限与chmod()的必要性
最近在Android平台用C语言开发时,踩了个文件权限设置的坑——用open()函数创建文件时,直接通过mode参数只能生效用户级的访问权限,如果要给文件配置组权限和其他用户权限,必须在文件创建完成后显式调用chmod()函数才行。
问题复现与验证
- 最初我尝试直接在
open()里指定包含组/其他权限的mode,比如:int fd = open("/data/test.txt", O_CREAT | O_WRONLY, 0666); - 但实际创建后用
ls -l查看权限,结果只有用户级的读写权限,组和其他权限完全没生效:-rw------- 1 u0_a123 u0_a123 0 2024-05-20 14:30 test.txt
解决方法:创建后调用chmod()补全权限
正确的流程是先创建文件(可以先设置基础的用户权限),再通过chmod()设置完整的权限组合:
#include <fcntl.h> #include <sys/stat.h> #include <unistd.h> int main() { // 先创建文件,仅设置用户级权限 int fd = open("/data/test.txt", O_CREAT | O_WRONLY, 0600); if (fd == -1) { // 处理创建错误 return -1; } // 显式设置包含组和其他用户的完整权限 if (chmod("/data/test.txt", 0666) == -1) { // 处理权限设置错误 close(fd); return -1; } close(fd); return 0; }
执行这段代码后,再查看文件权限就能得到预期的结果:
-rw-rw-rw- 1 u0_a123 u0_a123 0 2024-05-20 14:35 test.txt
补充重要发现
另外我还注意到,当尝试创建特殊类型的文件(比如私有目录、带有SUID/SGID位的文件)时,Android的SELinux安全策略可能会限制权限的生效。这种情况下,除了调用chmod(),还需要确保文件的SELinux上下文配置正确,否则权限设置可能依然达不到预期效果。
内容的提问来源于stack exchange,提问作者Bhupesh Pant
相关产品推荐
相关产品推荐

