我编写了以下代码,试图在Linux上创建一个0777模式的目录:
#include <sys/stat.h>
#include <sys/types.h>
int main () {
mkdir("/tmp/mkdir-test", 0777);
return 0;
}
但实际上,新目录有0755模式。
# stat /tmp/mkdir-test
File: `/tmp/mkdir-test'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: 802h/2050d Inode: 1772304 Links: 2
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2016-09-27 20:23:54.000000000 -0700
Modify: 2016-09-27 20:23:54.000000000 -0700
Change: 2016-09-27 20:23:54.000000000 -0700
有人可以解释一下吗?该程序如何创建一个真正的0777模式目录?
答案 0 :(得分:6)
在shell中运行umask
;它会报告022
。创建文件或目录时,umask
值中设置的位将从权限中删除。
要真正设置0777
权限,您需要使用umask()
来填充:
mode_t old_mask = umask(0);
mkdir("/tmp/mkdir-test", 0777);
umask(old_mask);
保留当前设置,除非您确定需要覆盖它。
顺便提一下,设置权限的另一个选项是:
const char *dirname = "/tmp/mkdir-test";
if (mkdir(dirname, 0777) == 0)
chmod(dirname, 0777);
chmod()
函数不受umask
值的影响。调用mkdir()
的权限并不重要;如果你愿意,可以使用0。如果你试图限制权限而不是像你的情况那样放松它们,那么这种方法不太令人满意 - mkdir()
和{之间存在TOCTOU(检查时间,使用时间)样式漏洞{1}}调用期间有人可以进入具有宽松权限的目录,这可能存在安全风险。最好使用chmod()
方法。 umask()
是一个非常简单的系统调用,因此非常快(与系统调用相比,与umask()
或open()
等重量级人物相比。
答案 1 :(得分:0)
您可以使用以下代码轻松完成此操作:
mkdirfile.cpp
#include <stdio.h>
#include <unistd.h>
#include <sys/syscall.h>
int main() {
long result;
result = syscall(__NR_mkdir, "/tmp/mkdir-test", 0777);
printf("The result is %ld.\n", result);
return 0;
}
然后使用gcc编译代码并运行它:
gcc mkdirfile.cpp && ./a.out