Chinaunix首页 | 论坛 | 博客
  • 博客访问: 31070
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 131
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-14 19:23
个人简介

a person

文章分类

全部博文(11)

文章存档

2015年(11)

我的朋友

分类: C/C++

2015-04-24 12:03:33

掩码:可以理解为屏蔽或者关闭对应的位; 掩码用来和其他值做位运算;
示例:
指令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命令查看

点击(此处)折叠或打开

  1. #include
  2. #include
  3. 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文件,命令如下:

点击(此处)折叠或打开

  1. umask 0066
  2. touch foo
  3. ls -al


-rw-------  1 root root    0 Apr 24 11:50 foo
可以看到已经屏蔽了这两个权限;

使用程序来完成:

点击(此处)折叠或打开

  1. #include <unistd.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. int main(void){
  8.  
  9.  mode_t mode=0066;
  10.  umask(mode);
  11.  
  12.  if(creat("foo",0644)<0)
  13.  perror("create file error");
  14.  
  15.  
  16.  
  17.  exit(0);
  18. }
在创建文件时,虽然指定了创建文件的权限是0644 即 rw-r--r--,但是由于将umask修改为了0066,创建的结果依然是rw-------;
-rw-------  1 root root    0 Apr 24 11:50 foo



阅读(1100) | 评论(0) | 转发(0) |
0

上一篇:typedef

下一篇:fcntl

给主人留下些什么吧!~~