我对目录权限有一个奇怪的问题。
在 C++ 应用程序中,我创建一个文件夹:
mkdir( "foldername", 777 );
但是当我尝试在该文件夹中创建文件时遇到问题,fopen()
返回NULL
并errno
告诉我Permission denied
。所以我检查了,确实,我对创建的文件夹具有以下权限:dr----x--t
(根文件夹有drwxrwxr-x
)
我查了一下,这个不寻常的t
意思是“暂时的”,但我不知道这意味着什么。
chmod 777 foldername
从 shell 完成这项工作并将属性设置为drwxrwxrwx
,但我无法每次都手动执行此操作。
问题: 有什么线索吗?为什么我的应用程序无法正确设置文件夹属性?这个“临时”属性的含义是什么?
(系统是Ubuntu 12.04)
答案1
t
不是“临时的”,这意味着粘滞位已设置。从man ls
:
t [表示] 粘滞位已设置(模式 1000),并且可搜索或可执行。 (请参阅 chmod(1) 或 Sticky(8)。)
粘滞位在这里设置是因为你设置了小数777(八月 1411),不是八进制777(十进制 511)。您需要编写0777
使用八进制,而不是777
。
mode
您还应该注意,参数 to的最终效果mkdir
还涉及与您的 umask 进行 AND 运算。从man 2 mkdir
:
参数模式指定要使用的权限。它是通过进程的umask以通常的方式修改的:创建的目录的权限是(mode & ~umask & 0777)。
我建议,如果这影响到您,请chmod
不要mkdir
使用模式参数。
最后警告:模式 777 几乎是绝不你真正想做的事。不要向所有用户全局开放目录,而是考虑在目录上设置适当的模式和所有者/组。如果您需要更复杂的规则,请考虑使用 ACL。
答案2
777
因为 C 是十进制。您应该使用它0777
,以便将其视为八进制。
答案3
您可能想使用八进制数而不是十进制数:
mkdir( "foldername", 0777 );
其次,你需要检查你的掩码设置以确保您实际上可以创建具有这些权限的索引节点。
参考:
答案4
除了其他好的答案之外,您可以设置umask
为000
创建文件夹之前,这样您就可以拥有所需的正确权限:
#include <stdio.h>
#include <sys/stat.h>
int main(void) {
mode_t old_umask;
old_umask = umask(0);
mkdir("tests", 0777);
umask(old_umask);
}
例子:
$ g++ -Wall mkdir.cpp
$ ./a.out
$ ls -ld tests
drwxrwxrwx. 2 cuonglm cuonglm 4096 Jun 23 16:55 tests
笔记
您可以在以下位置使用 POSIX 宏,而不是使用八进制模式mkdir
:
mkdir("tests", S_IRWXU | S_IRWXG | S_IRWXO);