C中的文件创建权限

C中的文件创建权限,c,file,file-permissions,C,File,File Permissions,我正在使用以下代码在C中创建一个文件: int outfd = open(arg,O_CREAT|O_TRUNC|O_WRONLY, f_per); f_per为文件权限号 将f_per设置为0644,执行代码并执行ls-l,可以将(输出)文件权限设置为-rw-r--。但是,将things设置为0777会将权限设置为-rwxr-x,而不是-rwxrwx。知道为什么会发生这种情况吗?根据,在O_create下: 。。。文件模式的访问权限位应设置为oflag参数后的参数值,oflag参数被视为类型

我正在使用以下代码在C中创建一个文件:

int outfd = open(arg,O_CREAT|O_TRUNC|O_WRONLY, f_per);
f_per
为文件权限号

f_per
设置为
0644
,执行代码并执行ls-l,可以将(输出)文件权限设置为
-rw-r--
。但是,将things设置为0777会将权限设置为
-rwxr-x
,而不是
-rwxrwx
。知道为什么会发生这种情况吗?

根据,在
O_create
下:

。。。文件模式的访问权限位应设置为oflag参数后的参数值,oflag参数被视为类型
mode\u t
,修改如下:按位对文件模式位和进程文件模式创建掩码补码中的相应位执行AND。

模式创建掩码(或umask)可以被视为减法掩码。例如,当文件模式创建掩码为
----w-/0002
时,如果您尝试创建具有权限的文件
rwxrwx/0777
,您将实际得到以下结果:

  rwxrwxrwx
& rwxrwxr-x (complement of -------w-)
  =========
  rwxrwxr-x
这似乎就是您所遇到的情况

如果您想实际创建具有特定权限的文件,可以通过将umask设置为零(并在之后恢复),暂时禁用umask,如下所示:

mode_t oldmask = umask(0); // needs sys/stat.h
int outfd = open(arg, O_CREAT|O_TRUNC|O_WRONLY, 0777);
umask(oldmask);

如果您在POSIX上:
umask
?参见!我丢失了
解除掩码
。它到底有什么用?(对C语言不是很有经验)没有
去掩码
<代码>umask
。正如在《曼乌玛斯克》(man-umask)中一样,我明白了。谢谢