Linux中umask命令/函数的用法简介

转载地址,我也做了一些补充,谢谢原作者!


 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.");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值