如何使用Posix上的C创建具有正确权限的目录

问题描述 投票:8回答:2

我正在尝试编写一个创建目录的简单C程序(mkdir clone。)。这是我到目前为止:

#include <stdlib.h>
#include <sys/stat.h> // mkdir
#include <stdio.h> // perror

mode_t getumask()
{
    mode_t mask = umask(0);
    umask (mask);
    return mask;
}

int main(int argc, const char *argv[])
{
    mode_t mask = getumask();
    printf("%i",mask);

    if (mkdir("trial",mask) == -1) {
        perror(argv[0]);
        exit(EXIT_FAILURE);
    }
    return 0;
}

这段代码用d---------创建目录,但是我希望用mzdir这样的drwxr-xr-x创建它?我在这做错了什么?

编辑:这是我的工作解决方案:

int main(int argc, const char *argv[])
{
    if (mkdir("trial",0777) == -1) {
        perror(argv[0]);
        exit(EXIT_FAILURE);
    }
    return 0;
}

根据umask设置正确的权限会自动处理。因此我只需要使用完全权限调用mkdir,并根据当前的umask进行切割。

c posix mkdir umask
2个回答
0
投票

正如Eric所说,umask是您获得的实际权限模式的补充。因此,不应将面具本身传递给mkdir(),而应将0777-mask传递给mkdir()


8
投票

你似乎误解了umask的用途。它设置/检索进程的文件模式创建掩码,该掩码又用于关闭您在mkdir等调用中指定的文件模式中的位,如下所示(pseduo-code):

real_mode = requested_mode & ~umask

因此,在您的代码中,由于您传入了umask本身的值,因此最终将权限指定为零,这正是您所看到的。

相反,您应该在调用mkdir时指定所需的权限,如下所示:

mkdir("trial", 0755)
© www.soinside.com 2019 - 2024. All rights reserved.