【问题标题】:Strange behaviour from system call creat来自系统调用 creat 的奇怪行为
【发布时间】:2011-05-13 09:06:18
【问题描述】:

我正在创建如下文件

 int fd  = creat(file_path.c_str() ,S_IRWXU|S_IRWXG|S_IRWXO);

虽然我为所有三个实体提供所有权限,但它会创建具有以下权限的文件。

-rwxr-xr-x

我在其中创建此目录的权限设置为

drwxrwxrwx

掩码

0022

你们能提出什么问题吗?

编辑:我可以对文件进行 chmod 以赋予它我计划的权限。我很好奇为什么上述方法失败了。

【问题讨论】:

    标签: c++ c unix system-calls


    【解决方案1】:

    你自己说的,你的umask是022,所以省略写权限;从 creat 手册页:

    有效权限由进程的umask按常规方式修改:创建文件的权限为(mode & ~umask)。

    【讨论】:

      【解决方案2】:

      您可能在 umask 限制下运行

      man umask
      

      应该让你走上正轨

      【讨论】:

        【解决方案3】:

        umask 与您在creat 调用中指定的文件权限相结合,以这种方式file_perms & ~umask 到达为文件实际设置的权限位。 umask 基本上指定了哪些位不应该被设置,即使你要求它们被设置。

        chmod 调用忽略 umask。而且您的目录权限在这里无关紧要(好吧,并非完全无关,如果您没有创建文件的目录的写入权限,它将完全失败)。

        【讨论】:

        • @Ricko M:不客气。一个忠告......你应该在接受答案之前等待一段时间。第一个给出一半体面答案的人并不总是给出最佳答案的人。我不是说我的更好。那是你来判断的。但如果您在 5 分钟内接受,您可能会错过更好的答案。
        【解决方案4】:

        umask 中的权限从openmkdir(以及creat 和朋友,类似地)的模式参数被关闭。例如,如果 mode 参数指定为:

        S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH(0666) 使用典型的 umask 0022 创建文件时,结果将是

        S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH (0644)

        因此,您正确地看到了未授予您正在创建的目录的写访问权限。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-13
          • 2016-04-30
          • 1970-01-01
          • 1970-01-01
          • 2020-02-10
          • 2014-01-22
          相关资源
          最近更新 更多