当我们使用creat函数时候,可以设置文件的权限。但是是不是creat想设置什么权限就设置什么权限呢?
当我们在终端输入umask -S的时候
表面我们所在的用户可以设置的权限。
同样在我们使用进程创建文件的时候,并不是可以使用creat函数为文件添加任何权限。
Creat函数的权限是进程权限的子集。换句话说,当进程只能具有的是u=rwx,g=rx,o=rx的时候。我们使用creat函数创建文件设置,u=rwx,g=rwx,o=rwx。这时候所创建的文件权限只能是u=rwx,g=rx,o=rx。Creat只能在进程权限的范围内活动。
现在引用umask函数,umask函数为进程设置文件模式创建屏蔽字。每个进程都有默认的防止权限,而umask这事更改防止权限
#include <stdio.h>
#include <fcntl.h>
#define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
int main()
{
umask(0);
if(creat("foo1",RWRWRW)<0)
printf("foo\n");
umask(S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
if(creat("bar1",RWRWRW)<0)
printf("bar\n");
exit(0);
}
这时候foo1具有u=rw,g=rw,o=rw的权限,bar1具有u=rw权限。因为umask屏蔽掉了S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH这四个权限
对creat来说,当进程屏幕了某些权限时候,creat为文件添加这些权限也无效。
umask(creat)也可以使用另外一种屏蔽(添加)权限的方法。
所有上面代码也可以写成
#include <stdio.h>
#include <fcntl.h>
#define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
int main()
{
umask(0);
if(creat("foo1",077)<0)
printf("foo\n");
umask(066);
if(creat("bar1",077)<0)
printf("bar\n");
exit(0);
}
Umask函数只改变进程权限,不改变用户权限。