android - C 文件 open() 函数仅在 Android 中设置用户级别权限

标签 android c file-io fopen android-sdcard

我正在使用 C open() 函数在 android 中创建文件并根据需要设置访问权限。我观察到在 Android 中,open() 只能设置用户级别的访问权限。为了给文件必要的组和其他级别的权限,我必须在创建文件后明确使用 chmod() 。

这是我正在做的,

/*Test code - starts*/
    tmp = open("/data/data/com.application.app1.tests/foo5.txt", O_CREAT | O_RDWR | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP ); // these permissions doen't seems o work hence will work with chmod
    close(tmp);
    tmp = open("/data/data/com.application.app1.tests/foo7.txt", O_CREAT | O_RDWR | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
    close(tmp);
    tmp = open("/data/data/com.application.app1.tests/foo8.txt", O_CREAT | O_RDONLY, S_IRUSR | S_IRGRP | S_IROTH);
    close(tmp);

    tmp = open("/data/data/com.application.app1.tests/foo55.txt", O_CREAT | O_RDWR | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP); // these permissions doen't seems o work hence will work with chmod
    close(tmp);
    chmod("/data/data/com.application.app1.tests/foo55.txt", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP);
    tmp = open("/data/data/com.microsoft.palAWasp.tests/foo77.txt", O_CREAT | O_RDWR | O_TRUNC | O_SYNC, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
    close(tmp);
    chmod("/data/data/com.application.palAWasp.tests/foo77.txt", S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
    tmp = open("/data/data/com.application.app1.tests/foo88.txt", O_CREAT | O_RDONLY, S_IRUSR | S_IRGRP | S_IROTH);
    close(tmp);
    chmod("/data/data/com.application.app1.tests/foo88.txt", S_IRUSR | S_IRGRP | S_IROTH);

    /*Test code - Ends*/

下面的输出是这样的,

enter image description here

/***************编辑***************/ 另一个重要的观察是,当我尝试使用上述权限位创建类似文件时,默认权限位是,

-rw------- u0_a100  u0_a100         0 2018-03-26 12:43 foo5.txt
-rw------- u0_a100  u0_a100         0 2018-03-26 12:43 log0.log

当我尝试使用 chmod 更改权限位时,它失败了。 请注意,chmod 适用于数据目录中的文件,但不适用于/sdcard/上的文件

请帮助我理解这种行为。

最佳答案

可能您正在寻找的是设置 umask,以便按照您的预期分配默认权限。

Linux umask command

这个其他链接解释了它是如何工作的。注意与错误代码相关的区域及其解释。

Setting Permissions

概述:系统在创建文件时根据与进程关联的 umask 限制文件的权限。您可以稍后使用 chmod 或 fchmod 更改权限。如果文件系统不允许某些权限(例如尝试将写权限设置为托管在只读文件系统中的文件),您将收到错误消息。如果指定了安装文件系统时的某些选项,这也适用。这可以解释这样一个事实,即您在/data 上调用的 chmod 正在工作,而不是在/sdcard 中(不同的文件系统具有与之关联的不同 umask 选项)。要了解有关您的场景的更多信息,请在 chmod 函数失败时检查 errno。

换句话说:

final_mask = mask_open & ~umask_process & mask_opt_filesystem

其中 mask_open 是在“open()”函数中指定的权限; umask_process 是指定到与进程关联的 umask 中的权限; mask_opt_filesystem 是与创建新文件时与上述组合的文件系统相关联的掩码; final_mask 是表示分配给刚刚创建的文件的权限的最终掩码。

最后,您可以更改当前进程和子进程的 umask,但不推荐这样做,请阅读以上链接,这样您就可以使用 chmod 做正确的事情。

如果您在 Android 设备内的终端中运行“mount”,您会看到一些条目出现“mode”选项。这是用于该文件系统的掩码。如果您在同一个终端中运行“umask”,您可以看到应用到终端中的 umask。

关于android - C 文件 open() 函数仅在 Android 中设置用户级别权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48606644/

相关文章:

python - 列出文件夹中的 png 文件

java - 包含什么不可告人的方法?

Android spinner dialogMode 样式

android - 有什么办法可以让伴奏库的两个水平寻呼机同步工作?

android - 如何使用shell命令创建local.properties

c - 如何将程序拆分为多个包含一个 .h 和几个 .c 文件的文件?

c++ - musl 的 GCC 包装器与 musl 的交叉编译器有何不同?

C 程序输出返回 0

java - 如何通过以编程方式提供 SELECTALL CHECKBOX 来检查多选警报框中的所有项目

C++按行读取逗号分隔文件[其中一个部分为mm/dd/yyyy],安全地放入结构中