gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:14:14 25 4
gpt4 key购买 nike

我正在使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com