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

9

我在尝试编写一个简单的C程序,用来创建目录(类似mkdir的功能)。以下是我的代码:

#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---------的目录,但是我希望它能像 mkdir 命令一样创建权限为 drwxr-xr-x 的目录。请问我在这里做错了什么?


诊断打印会产生什么?如果在“%i”后添加一个换行符可能会更好,如果使用“%o”或“%.4o”而不是“%i”,则更容易阅读。此外,您似乎缺少“#include <sys/stat.h>”,该文件声明了umask()mkdir()函数。 - Jonathan Leffler
使用%4o运算符,它会产生22。 - yasar
3个回答

13

您似乎误解了umask的用途。它设置/检索进程的文件模式创建掩码,进而用于在像这样的调用中关闭mkdir中指定的文件模式中的位(伪代码):

real_mode = requested_mode & ~umask

在你的代码中,由于传递了umask的值本身,所以你最终指定了权限为0,这正是你看到的结果。

相反,你应该在调用mkdir时指定你想要的权限,像这样:

mkdir("trial", 0755)

3
我认为yasar11732想要融合当前用户的umask设置,而不是硬编码0755。这只是我的猜测。 - Reci
1
在应用程序中通常不需要干扰用户的umask;libc已经在mkdir()中为您完成了这项工作。因此,硬编码0755或0775是完全可以的。 - Daniel Roethlisberger
4
如果我输入 umask 0,那会怎样?硬编码为 0755 会变成 0755 而不是期望的 0777。也许像 yasar11732 所评论的那样硬编码为 0777 更正确,但对于 0777 & ~mask 没有伤害。 - Reci
我正在尝试创建带有drwxrwxr-x权限的目录,如果我正确理解了mkdir文档,那么0775应该可以实现,但实际上并没有。我需要成为su吗? - airdas

2
正如Eric所说,umask是您实际获得的权限模式的补数。因此,您应该将0777-mask传递给mkdir(),而不是直接传递掩码本身。

2
谢谢,我确实想要加入 umask 以获取正确的权限。不过,我将 0777-mask 更改为了 0777 & ~mask。 :) - yasar
1
实际上我不需要直接使用umask,因为显然mkdir已经这样做了。所以当我的umask是022时,使用0777会导致一个带有drwxr-xr-x的目录。 - yasar

1
免责声明:本答案是从原始问题中提取的。答案不应包含在问题本身中

yasar提供的答案:

这对我来说是可行的解决方案:

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

根据umask设置正确的权限已经自动处理。因此,我只需要使用完全权限调用mkdir,然后根据当前umask进行裁剪。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接