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

yas*_*sar 8 c posix umask mkdir

我正在尝试编写一个创建目录的简单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;
}
Run Code Online (Sandbox Code Playgroud)

这段代码创建了目录,d---------但我希望它drwxr-xr-x像mkdir一样创建它吗?我在这做错了什么?

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

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

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

Eri*_*ski 8

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

real_mode = requested_mode & ~umask
Run Code Online (Sandbox Code Playgroud)

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

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

mkdir("trial", 0755)
Run Code Online (Sandbox Code Playgroud)

  • 如果我'umask 0`怎么办?硬编码0755将使其成为0755而不是所需的0777.也许硬编码0777更正确,因为yasar11732评论,但它对'0777&〜mask`无害. (4认同)
  • 我认为yasar11732想要合并当前用户的umask设置,而不是硬编码`0755`.只是我的猜测. (3认同)

Cre*_*ing 2

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

  • 谢谢,我确实想合并 umask 以获得正确的许可。不过,我将 0777-mask 更改为 0777 &amp; ~mask 。:) (2认同)