umask 函数设置当前进程的权限为屏蔽字; 系统会有一个默认的屏蔽字, 为了确保创建文件具有的权限位成功被设置, 需要使用 umask 将屏蔽字置 0;
系统屏蔽字用 shell 查看, 比如得到如下结果, 其为八进制表示形式, 以 0 开头; 这个屏蔽字表示屏蔽掉了组的写和其他的写权限;
1 0022
下面的例子很好的说明了 umask 的使用, 首先使用 umask(0) 将屏蔽字置 0, 此时新建 foo 文件, 可见其具有设置的全部读写权限; 而后用 umask 屏蔽掉组和其他的读写位, 新建 bar, 可见 bar 之具有用户读写权限;
另外需要注意的是, 进程设置 umask 不会改变到系统的 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)
- err_sys("creat error for foo");
- umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
- if (creat("bar", RWRWRW) < 0)
- err_sys("creat error for bar");
- exit(0);
- }
- $ umask first print the current file mode creation mask
- 002
- $ ./a.out
- $ ls -l foo bar
- -rw------- 1 sar 0 Dec 7 21:20 bar
- -rw-rw-rw- 1 sar 0 Dec 7 21:20 foo
- $ umask see if the file mode creation mask changed
- 002
来源: http://www.bubuko.com/infodetail-3264717.html