umask命令用得相对不多, 而umask函数则用得相对较多。 下面, 我们先来看看umask命令, 它主要用来屏蔽权限,设置权限屏蔽字, 说白了, 就是间接地设置权限。
我们先打开一个linux shell终端, 执行一些命名, 得到如下的结果:
[taoge@localhost learn_c]$ umask
0002
[taoge@localhost learn_c]$ touch a.txt
[taoge@localhost learn_c]$ ls -l
total 0
-rw-rw-r-- 1 taoge taoge 0 May 5 06:57 a.txt
[taoge@localhost learn_c]$ umask 022
[taoge@localhost learn_c]$ umask
0022
[taoge@localhost learn_c]$ touch b.txt
[taoge@localhost learn_c]$ ls -l
total 0
-rw-rw-r-- 1 taoge taoge 0 May 5 06:57 a.txt
-rw-r--r-- 1 taoge taoge 0 May 5 06:58 b.txt
[taoge@localhost learn_c]$ mkdir zzz
[taoge@localhost learn_c]$ ls -l
total 4
-rw-rw-r-- 1 taoge taoge 0 May 5 06:57 a.txt
-rw-r--r-- 1 taoge taoge 0 May 5 06:58 b.txt
drwxr-xr-x 2 taoge taoge 4096 May 5 07:00 zzz
[taoge@localhost learn_c]$
我们看到, 在我的系统中, umask的默认值是002(当然, 在你系统中, 很可能就不是酱紫的)。 002是个什么意思呢? 意思是说, 如果创建文件, 那么它的默认权限是664, 如果是创建目录, 那么它的权限是775.
好, 我们创建一个文件a.txt, 然后查看一下, 发现该文件的权限果然是664.
下面, 我们来改一下umask的默认值, 改为022, 并检验一下, 发现确实是修改成功的, 这意味着:创建文件的默认权限是644, 创建目录的默认权限是755, 我们实践一下, 发现果真如此。
由此可见, umask就是为控制默认权限而生的。
还没完, 我们再打开另一个终端, 进行操作, 结果为:
[taoge@localhost learn_c]$ umask
0002
[taoge@localhost learn_c]$ ls -l
total 4
-rw-rw-r-- 1 taoge taoge 0 May 5 06:57 a.txt
-rw-r--r-- 1 taoge taoge 0 May 5 06:58 b.txt
drwxr-xr-x 2 taoge taoge 4096 May 5 07:00 zzz
我们看到, 在另外一个shell终端中, umask的值仍然是002, 可见, 一个shell进程中的umask值仅在当前shell进程中才有效。
好, 我们接着看umask函数, 它常用来控制进程创建文件/目录的默认权限, 代码如下:
#include <stdio.h>
int main()
{
system("touch test0.txt");
system("mkdir folder0");
umask(022);
system("touch test1.txt");
system("mkdir folder1");
umask(066);
system("touch test2.txt");
system("mkdir folder2");
system("ls -l");
return 0;
}
结果为:
[taoge@localhost learn_c]$ umask 000
[taoge@localhost learn_c]$ gcc test.c
[taoge@localhost learn_c]$ ./a.out
total 24
-rwxrwxrwx 1 taoge taoge 4925 May 5 07:43 a.out
drwxrwxrwx 2 taoge taoge 4096 May 5 07:43 folder0
drwxr-xr-x 2 taoge taoge 4096 May 5 07:43 folder1
drwx--x--x 2 taoge taoge 4096 May 5 07:43 folder2
-rw-rw-rw- 1 taoge taoge 0 May 5 07:43 test0.txt
-rw-r--r-- 1 taoge taoge 0 May 5 07:43 test1.txt
-rw------- 1 taoge taoge 0 May 5 07:43 test2.txt
-rwxrw-rw- 1 taoge taoge 279 May 5 07:42 test.c
[taoge@localhost learn_c]$ umask
0000
[taoge@localhost learn_c]$
我们知道, shell是父进程, ./a.out进程是子进程. 下面来分析一下:
1. 根据test0.txt可知, 父进程可以影响子进程的默认屏蔽字。
2. 根据test1.txt可知, 子进程可以改变自己的默认屏蔽字。
3. 根据最后shell进程的屏蔽字为000可知, 子进程不会改变父进程的屏蔽字。
实际上, umask命令与函数的用法是一致的。 那一年, 我第一次看到umask, 还使劲琢磨着这个玩意儿是干啥的, 哈哈。
补充: 在创建守护进程的时候,会用到这个函数,设置权限屏蔽字。如下例:
//创建 守护进程
void runAsDaemon()
{
pid_t pid;
int maxfileno;
int fd;
if (-1 == (pid = fork()))
{
macroFunc("daemon: fork error.");
exit(-1);
}
if (pid > 0)
exit(EXIT_SUCCESS);
if (-1 == setsid())
{
macroFunc("daemon: setsid error.");
exit(-2);
}
chdir("/");
umask(0);
maxfileno = getdtablesize();
for (fd = 0; fd < maxfileno; fd++)
close(fd);
macroFunc("daemon: sounder run as daemon.");
}