【问题标题】:"creat" function gives wrong permissions“创建”功能提供了错误的权限
【发布时间】:2016-07-06 05:27:03
【问题描述】:

我的代码如下:

#include "unistd.h"
#include <fcntl.h>

#define BSIZE 50

int main(int argc, char *argv[]) {
    int f1, f2;
    char buf[BSIZE];

    f1 = open(argv[1], 0x0001, 0);
    f2 = creat(argv[2], 0777);

    read(f1, buf, BSIZE);
    write(f2, buf, BSIZE);

    return 0;
}

当我创建一个名为“a”的文件并将编译后的程序与命令一起使用时

./a.out a b

它确实创建了一个包含“a”内容的文件。但我的问题是,它的权限是-rwxr-xr-x。它不授予组和其他人写权限。此外,当我将功能更改为creat(argv[2], 0022); 那么权限将变为全 0 ----------

creat 函数有什么问题吗?因为chmod 工作正常。

【问题讨论】:

    标签: c unix permissions file-permissions


    【解决方案1】:

    文件创建使用两种组合访问权限:

    1. 您通过creatopen 提供的那个
    2. 和进程掩码,又名umask

    umask 通过屏蔽一些位来保护创建的文件具有一些意外访问,从而为程序的用户提供一些最终控制权。一般来说,umask 等于022 意味着删除组和其他人的写访问权限,即用户不想要更多的rwxr-xr-x

    然后,当您回收 0777 时,它会被 ~umask 屏蔽(和),这里是 07550755。 当您回收 022 时,0755 被屏蔽(和),并提供 000

    【讨论】:

    • 您对“umask”的解释很好地满足了我的问题。谢谢。
    【解决方案2】:

    opencreatfopen 等创建的文件会使用默认的 umask 屏蔽掉模式位。您可能拥有022 中的umask,这是一个宽松的默认值。将umask 更改为0 风险很大。正确的方法是明确使用chmod 覆盖此默认值,并使您的文件可被组成员和其他人写入。

    【讨论】:

      猜你喜欢
      • 2019-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      相关资源
      最近更新 更多