尝试在 C 中创建对所有人具有完全权限的文件

Posted

技术标签:

【中文标题】尝试在 C 中创建对所有人具有完全权限的文件【英文标题】:Trying to create file in C with full permissions for all 【发布时间】:2016-01-17 06:39:14 【问题描述】:

在我的代码中,我有以下片段:

char* filename="/something.txt";
umask(0);
int filehandle=open(filename,O_WRONLY|O_CREAT|0x777);
close(filehandle);

执行后,文件已创建,但权限设置不正确,即使我完全按照文档进行操作。

文档状态:

参数模式指定在创建新文件时使用的权限。它是由进程的umask以通常的方式修改的:创建文件的权限是(mode & ~umask)。

对于模式,我指定了 0x777,这意味着读取、写入和执行。对于 umask,我指定了 0,所以 0x777 & ~0 应该是 777。

实际产生的权限是670。

为什么会这样,我该如何解决?

【问题讨论】:

尝试打开(文件名,O_WRONLY|O_CREAT,0x777);而不是 open(filename,O_WRONLY|O_CREAT|0x777); int filehandle=open(filename,O_WRONLY|O_CREAT|0x777); 是错误的。 modeopen() 的单独参数,应该是 0777 而不是 0x777 好的,这两个建议结合起来对我有用。谢谢。 【参考方案1】:

首先,它应该是八进制 0777 而不是十六进制 0x777,等价物是:

0x777   0111 0111 0111   011 101 110 111   r-xrw-rwx, plus other stuff(a)
0777    111 111 111          111 111 111   rwxrwxrwx

其次,签名是:

int open(const char *pathname, int flags, mode_t mode);

意味着模式是一个单独的参数,而不是你or带有标志的东西。

因此您要查找的行是:

int filehandle = open (filename, O_WRONLY | O_CREAT, 0777);

(a) 我相信 POSIX 未指定这些高位,但 Linux 会使用它们来指示文件是 setgidsticky(虽然不是原始意义上的粘性,意思是代码被缓存在交换空间中- Linux 从来不支持,而是使用粘滞位来限制谁可以对粘滞目录中的文件执行某些操作。

【讨论】:

以上是关于尝试在 C 中创建对所有人具有完全权限的文件的主要内容,如果未能解决你的问题,请参考以下文章

Win10后台任务的文件权限

为啥要执行权限以及在 c(Linux) 中创建文件所需的写权限? [关闭]

Inno Setup - 如何设置文件夹的完全权限,而不仅仅是它的内容

如何在单个命令中创建目录并授予权限

在Firestore中创建对Cloud Storage文档的引用

使所有新目录具有777权限