尝试在 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);
是错误的。 mode
是 open()
的单独参数,应该是 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 会使用它们来指示文件是 setgid
和 sticky
(虽然不是原始意义上的粘性,意思是代码被缓存在交换空间中- Linux 从来不支持,而是使用粘滞位来限制谁可以对粘滞目录中的文件执行某些操作。
【讨论】:
以上是关于尝试在 C 中创建对所有人具有完全权限的文件的主要内容,如果未能解决你的问题,请参考以下文章
为啥要执行权限以及在 c(Linux) 中创建文件所需的写权限? [关闭]
Inno Setup - 如何设置文件夹的完全权限,而不仅仅是它的内容