掩码:可以理解为屏蔽或者关闭对应的位; 掩码用来和其他值做位运算;
示例:
指令cmd=0110011011 ,现在要创建一个掩码,将该指令的最后4位清零;
创造掩码mask=0000001111
用掩码的反码和指令做按位与运算 cmd & ~mask= 0110011011 & 1111110000 = 0110010000
则最后4位被清零
在linux中,文件的权限是由四位八进制表示,分为三组权限(user,group,other),每一位八进制可以表示读、写、可执行三种权限;
在 中定义:
#define S_IRWXU 00700
#define S_IRUSR 00400
#define S_IWUSR 00200
#define S_IXUSR 00100
#define S_IRWXG 00070
#define S_IRGRP 00040
#define S_IWGRP 00020
#define S_IXGRP 00010
#define S_IRWXO 00007
#define S_IROTH 00004
#define S_IWOTH 00002
#define S_IXOTH 00001
现在通过一个实例演示umask作用于创建文件权限的例子:
假设当前的umask是0022(八进制)
用二进制表示为:
0000 0000 0010 0010 // 0022
对应的权限是:
S_IWGRP|S_IWOTR 0022 //这里使用了按位或运算
很显然,当前的umask掩码是为了关闭这两个组的“写”权限,下面看如何来关闭的:
假如现在要创建一个文件,为其指定了一下权限:
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH 0666
二进制表示为:
0000 0110 0110 0110 // 0666
那么使用umask作用后,真正拥有的权限是0644:
0666 & ~0022 = 0644
0000 0110 0110 0110 // 0666
&
1111 1111 1101 1101 // ~0022
0644即 rw-r--r--,可以看到这里屏蔽了S_IWGRP和S_IWOTR这两个权限;
在linux系统中,umask的类型用mode_t表示,默认的umask值为0022,可以使用umask命令查看
-
#include
-
#include
-
mode_t umask(mode_t mode);
示例:
当前的umask为0022;
touch foo 结果为:
-rw-r--r-- 1 root root 0 Apr 24 11:46 foo
现在设置umask为066 即屏蔽group 和 other组的 “读”和“写”权限;再次创建foo文件,命令如下:
-
-
umask 0066
-
touch foo
-
ls -al
-rw------- 1 root root 0 Apr 24 11:50 foo
可以看到已经屏蔽了这两个权限;
使用程序来完成:
-
#include <unistd.h>
-
#include <sys/types.h>
-
#include <sys/stat.h>
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
int main(void){
-
-
mode_t mode=0066;
-
umask(mode);
-
-
if(creat("foo",0644)<0)
-
perror("create file error");
-
-
-
-
exit(0);
-
}
在创建文件时,虽然指定了创建文件的权限是0644 即 rw-r--r--,但是由于将umask修改为了0066,创建的结果依然是rw-------;
-rw------- 1 root root 0 Apr 24 11:50 foo
阅读(1100) | 评论(0) | 转发(0) |