重读APUE(6)-umask
umask函数设置当前进程的权限为屏蔽字;系统会有一个默认的屏蔽字,为了确保创建文件具有的权限位成功被设置,需要使用umask将屏蔽字置0;
系统屏蔽字用shell查看,比如得到如下结果,其为八进制表示形式,以0开头;这个屏蔽字表示屏蔽掉了组的写和其他的写权限;
1 0022
下面的例子很好的说明了umask的使用,首先使用umask(0)将屏蔽字置0,此时新建foo文件,可见其具有设置的全部读写权限;而后用umask屏蔽掉组和其他的读写位,新建bar,可见bar之具有用户读写权限;
另外需要注意的是,进程设置umask不会改变到系统的umask,只在进程内部有效;
1 #include "apue.h" 2 #include <fcntl.h> 3 4 #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) 5 6 int 7 main(void) 8 { 9 umask(0); 10 if (creat("foo", RWRWRW) < 0) 11 err_sys("creat error for foo"); 12 umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH); 13 if (creat("bar", RWRWRW) < 0) 14 err_sys("creat error for bar"); 15 exit(0); 16 }
1 $ umask first print the current file mode creation mask 2 002 3 $ ./a.out 4 $ ls -l foo bar 5 -rw------- 1 sar 0 Dec 7 21:20 bar 6 -rw-rw-rw- 1 sar 0 Dec 7 21:20 foo 7 $ umask see if the file mode creation mask changed 8 002