我用 C 打开一个文件并用以下代码编写它:
int fd = open("soandso.txt", O_RDWR | O_CREAT);
write(fd, buf_of_data, 3);
该文件现在仅对我有写权限,这不是我在 open 中指定的权限。我究竟做错了什么?
答案1
文件创建权限由该值修改umask
。
因此,例如:
$ umask
0022
$ touch xyz
$ ls -l xyz
-rw-r--r-- 1 sweh sweh 0 Sep 22 08:37 xyz
umask值符合标准读写模式,所以值为0022
删除 ----w--w-
新创建的文件的权限。
我们可以改变这一点:
$ umask 002
$ touch abc
$ ls -l abc
-rw-rw-r-- 1 sweh sweh 0 Sep 22 08:38 abc
现在002面具只去除-------w-
创建没有屏蔽的文件
$ umask 0
$ touch def
$ ls -l def
-rw-rw-rw- 1 sweh sweh 0 Sep 22 08:40 def
如果您希望程序忽略该umask
值,则必须umask(2)
在调用之前显式调用该函数open(2)
open(2)
请注意,与标志一起使用时O_CREAT
,您还应该传递权限模式。例如
open("myfile",O_CREAT|O_RDWR,0666);
在这种情况下,模式字段也会通过值进行修改,umask
因此创建的实际模式是(mode & ~umask)
。