umask的作用是为进程设置文件模式创建屏蔽字,也就是说linux中每创建一个文件,则文件权限取决于umask设置的屏蔽状态。
1 文件权限
理解umask之前,先看下文件权限。
所有文件类型(目录文件、字符特别文件等)都有访问权限,很多人认为只有普通文件有访问权限,这是一种误解。每个文件的9个访问权限位,可以分成三类,见下表1,表中u表示用户,即文件的所有者,g表示组,o表示其他。可以使用chmod修改文件权限。
进程每次打开、创建或删除一个文件时,内核就进行文件访问权限测试。
若进程的有效ID是0,既超级用户,则允许访问,超级用户root对整个文件系统进行处理的最充分的自由。
若有效ID为文件的所有者,那么进程根据相应的权限位访问该文件,用户对该文件对应的读为为1,则可读,写位为1,则可写,执行位为1,则可以执行。
其他用户的访问权限被设置,则允许访问,否则拒绝。
表1
2 umask的作用
umask函数为进程设置文件模式,并返回以前的值。
#include <sys/stat.h>
mode_t umask( mode_t cmask);
输入参数cmask就是表1的9个参数构成的或( | ),如(S_IRUSR|S_IWUSR)。
进程创建一个文件或者目录,就一定会使用该文件模式去创建屏蔽字,在文件模式创建屏蔽字中为1的位,在文件mode中相应位则一定要关闭。就是说取反。看如下umask例子。
#include "apue.h"
#include <fcntl.h>
#define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)
int main(void)
{
umask(0);
if (creat("foo", RWRWRW) < 0)
perror("creat error for foo");
umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
//umask(0400);
if (creat("bar", RWRWRW) < 0)
perror("creat error for bar");
//write(STDOUT_FILENO , "nimei" , sizeof("nimei"));
exit(0);
}
采用gcc编译代码,gcc umask.c apue.h -o a.out ,在shell中输入./a.out,在输入命令ls -l ,bar和foo的权限如下,umask(0)的时候,按0取反,就是666(文件)或者777(文件夹),这里的6=4(读)+2(写)就是进程创建的文件对所有用户具有可读可写,umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH)里的屏蔽字可以对照表格来看,屏蔽了用户组和其他用户的读写。同时需要注意的是creat函数,如果已存在该文件,将不会重新创建。
-rw------- 1 zhouzhenhe zhouzhenhe 0 Oct 21 13:12 bar
-rw-rw-rw- 1 zhouzhenhe zhouzhenhe 0 Oct 21 13:12 foo
umask的参数按位取反就是允许的创建文件权限,004表示阻止其他用户读,002表示阻止其他用户写,400表示阻止用户读。记住4读2写1执行。