判断/home下有没有文件aaa.txt,如果存在则提示错误,如果文件不存在则创建且文件最终权限为644。

#include<stdio.h>
#include<fcntl.h>
int main(void){
int fd;
fd = open("/home/aaa.txt",O_WRONLY | O_CREAT | O_EXCL,0666);
if (fd == -1)
printf ("Error: File exists.\n" );
}

wKioL1PV7zuAGuCJAACOo532xvg444.jpg

例子的代码比较简单,但是有几个地方需要说明,一个文件的权限是受到open函数参数给定(代码是0666)和umask值同时影响的,0666-0022=0644(更准确的方法是使用“与运算”获得权限)

wKiom1PV7rbgSKYfAAAX_n3M3Fw732.jpg

当前为root用户umask是0022,在当前shell下启的进程都是会继承当前的umask值,包括make,gcc和touch命令的进程,为了直观用stat查看,两个文件分别是之前make编译出的aaa.txt和touch创建的bbb.txt,默认权限都是644

wKiom1PV8E7gowBxAABU9F_xssM629.jpg

如果需要使创建的文件权限为代码参数中指定的权限,那么只要把umask设置为0

wKioL1PV88HxM2ugAACPrMG_418776.jpg

总结:1.进程具有继承权限的特点。

            2.一个文件的权限是受到open函数的参数和当前shell的umask值共同影响的。

也许会有人要问,touch命令会用到open函数了吗?那么strace下看看,很明显的结果,默认是0666减去umask的权限。

wKiom1PV9CvShayAAAI-IlFe07A971.jpg