为什么我的程序无法使用mkdir系统调用设置0777模式?

时间:2016-09-28 03:36:22

标签: c linux

我编写了以下代码,试图在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模式目录?

2 个答案:

答案 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