"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
工作正常。
由 open
、creat
、fopen
等创建的文件使用默认值 umask
屏蔽模式位。您可能有 022
的 umask
,这是一个宽松的默认值。将 umask
更改为 0
会非常冒险。正确的方法是使用 chmod
显式覆盖此默认值并使您的文件对组成员和其他人可写。
文件创建使用两种组合访问权限:
- 您通过
creat
或 open
提供的那个
- 和进程掩码,又名
umask
umask
通过屏蔽一些位来保护创建的文件有一些意外访问,从而为程序的用户提供一些最终控制权。一般来说,umask
等于 022
意味着删除组和其他人的写访问权限,即用户不想要超过 rwxr-xr-x
.
然后当你回收 0777 时,它会被 ~umask
屏蔽(并且)0755
给出 0755
。
当你回收 022
时,0755
被屏蔽(并且)给出 000
.
我的代码如下:
#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
工作正常。
由 open
、creat
、fopen
等创建的文件使用默认值 umask
屏蔽模式位。您可能有 022
的 umask
,这是一个宽松的默认值。将 umask
更改为 0
会非常冒险。正确的方法是使用 chmod
显式覆盖此默认值并使您的文件对组成员和其他人可写。
文件创建使用两种组合访问权限:
- 您通过
creat
或open
提供的那个
- 和进程掩码,又名
umask
umask
通过屏蔽一些位来保护创建的文件有一些意外访问,从而为程序的用户提供一些最终控制权。一般来说,umask
等于 022
意味着删除组和其他人的写访问权限,即用户不想要超过 rwxr-xr-x
.
然后当你回收 0777 时,它会被 ~umask
屏蔽(并且)0755
给出 0755
。
当你回收 022
时,0755
被屏蔽(并且)给出 000
.