【问题标题】:How to create directory with right permissions using C on Posix如何在 Posix 上使用 C 创建具有正确权限的目录
【发布时间】:2012-04-26 05:45:57
【问题描述】:

我正在尝试编写一个简单的 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,它会更容易阅读。此外,您似乎缺少声明 umask()mkdir()#include &lt;sys/stat.h&gt;
  • 它产生 22 和 %4o。

标签: c posix mkdir umask


【解决方案1】:

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

real_mode = requested_mode & ~umask

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

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

mkdir("trial", 0755)

【讨论】:

  • 我认为 yasar11732 想要合并当前用户的 umask 设置,而不是硬编码0755。只是我的猜测。
  • 通常不需要在应用程序中弄乱用户的umask; libc 已经在mkdir() 中为您完成了这项工作。所以硬编码 0755 或 0775 完全没问题。
  • 如果我umask 0怎么办?硬编码 0755 将使其成为 0755 而不是所需的 0777。也许硬编码 0777 更正确,正如 yasar11732 评论的那样,但它对0777 &amp; ~mask 无害。
  • 我正在尝试创建具有drwxrwxr-x 权限的目录,如果我正确理解了mkdir 文档,那么0775 应该提供该权限,但事实并非如此。我需要苏吗?
【解决方案2】:

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

【讨论】:

  • 谢谢,我确实想合并 umask 以获得正确的许可。不过,我将 0777-mask 更改为 0777 & ~mask。 :)
  • 我实际上不需要直接使用 umask,因为看起来 mkdir 已经这样做了。因此,当我的 umask 为 022 时,使用 0777 会生成带有 drwxr-xr-x 的目录
【解决方案3】:

免责声明:我从 OPs 问题中提取了这个答案。 Answers should not be contained in the question itself.


yasar提供的答案:

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

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

根据 umask 设置正确的权限是自动处理的。所以我只需要调用具有完全权限的 mkdir,然后根据当前的 umask 进行切分。

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 2012-01-17
    • 1970-01-01
    • 2023-03-22
    • 2017-07-10
    • 1970-01-01
    • 2011-10-04
    相关资源
    最近更新 更多