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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:34:37