判断/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" ); }
例子的代码比较简单,但是有几个地方需要说明,一个文件的权限是受到open函数参数给定(代码是0666)和umask值同时影响的,0666-0022=0644(更准确的方法是使用“与运算”获得权限)
当前为root用户umask是0022,在当前shell下启的进程都是会继承当前的umask值,包括make,gcc和touch命令的进程,为了直观用stat查看,两个文件分别是之前make编译出的aaa.txt和touch创建的bbb.txt,默认权限都是644
如果需要使创建的文件权限为代码参数中指定的权限,那么只要把umask设置为0
总结:1.进程具有继承权限的特点。
2.一个文件的权限是受到open函数的参数和当前shell的umask值共同影响的。
也许会有人要问,touch命令会用到open函数了吗?那么strace下看看,很明显的结果,默认是0666减去umask的权限。
Linux C代码分析文件权限
时间: 2024-10-28 15:01:55