我的代码如下:
#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;
}
当我创建一个名为&#39; a&#39;并使用命令
编译程序./a.out a b
它会创建一个文件,内容为&#39; a&#39;确实。但问题是,它的权限是-rwxr-xr-x
。它不会为组和其他人提供写入权限。而且,当我将函数更改为creat(argv[2], 0022);
时
那么许可将全部为0 ----------
。
creat
功能有什么问题吗?因为chmod
工作正常。
答案 0 :(得分:2)
文件创建使用两个组合访问权限:
creat
或open
umask
umask
通过屏蔽一些位来保护程序用户的最终控制,以保护具有一些意外访问的创建文件。一般情况下,umask
等于022
表示已删除群组和其他群组的写入权限,即用户不要超过rwxr-xr-x
。
然后当你收回0777时,它会被~umask
0755
屏蔽(和),0755
给出022
。
当您回复0755
时,000
屏蔽{和} id | product name | shop Name
----------------------------
1 | Suger | Ram Store
-----------------------------
2 | Oil | Suraj Store
-------------------------------
3 | Batter | Ram Store
------------------------------
4 | Maida | Ram Store
--------------------------------
5 | Rice | Ram Store
--------------------------------
6 | Suger | Suraj Store
--------------------------------
7 | Oil | Ram Store
--------------------------------
8 | Rice | Suraj Store
。
答案 1 :(得分:1)
由open
,creat
,fopen
等创建的文件使用默认umask
屏蔽模式位。您可能有umask
022
,这是一个宽松的默认值。将umask
更改为0
会非常危险。正确的方法是明确使用chmod
来覆盖此默认值,并使组成员和其他人可以写入您的文件。