"creat" 函数给出了错误的权限

"creat" function gives wrong permissions

我的代码如下:

#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 工作正常。

opencreatfopen 等创建的文件使用默认值 umask 屏蔽模式位。您可能有 022umask,这是一个宽松的默认值。将 umask 更改为 0 会非常冒险。正确的方法是使用 chmod 显式覆盖此默认值并使您的文件对组成员和其他人可写。

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

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

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

然后当你回收 0777 时,它会被 ~umask 屏蔽(并且)0755 给出 0755。 当你回收 022 时,0755 被屏蔽(并且)给出 000.