我正在使用 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*/
下面的输出是这样的,
/***************编辑***************/ 另一个重要的观察是,当我尝试使用上述权限位创建类似文件时,默认权限位是,
-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,以便按照您的预期分配默认权限。
这个其他链接解释了它是如何工作的。注意与错误代码相关的区域及其解释。
概述:系统在创建文件时根据与进程关联的 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/