Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1740578
  • 博文数量: 438
  • 博客积分: 9799
  • 博客等级: 中将
  • 技术积分: 6092
  • 用 户 组: 普通用户
  • 注册时间: 2012-03-25 17:25
文章分类

全部博文(438)

文章存档

2019年(1)

2013年(8)

2012年(429)

分类: 系统运维

2012-03-28 13:25:59

既然我们已经描述了每个文件相关的9个权限位,我们可以描述下与每个进程相关取的文件模式创建掩码(file mode creation mask)。

umask函数为进程设置文件模式创建掩码,并返回其之前的值。(这是很少的几个不返回错误值的函数之一。)


  1. #include <sys/stat.h>

  2. mode_t umask(mode_t cmask);

  3. 返回前一个文件模式创建掩码


cmask参数由4.5节里的表中的9个常量的任意位或的值:S_IRUSR、S_IWUSR等。


每当进程创建一个新文件或一个新目录时,文件模式创建掩码就会被使用。(回想下3.3节和3.4节里我们对open和creat函数的描述。两者都接受一 个mode参数来指定新文件的访问权限位。)我们在4.20节讲述如何创建一个新的目录。文件模式创建掩码的任何位都会在文件模式里关闭。


看下面的例子:


  1. #include <sys/stat.h>
  2. #include <fcntl.h>

  3. #define RWRWRW (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH)

  4. int
  5. main(void)
  6. {
  7.         umask(0);
  8.         if (creat("foo", RWRWRW) < 0)
  9.                 exit(1);
  10.         umask(S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);
  11.         if (creat("bar", RWRWRW) < 0)
  12.                 exit(1);
  13.         exit(0);
  14. }


首先查看下当前的umask值:
$ umask
0022

运行a.out,并查看新文件的模式:
$ ./a.out
$ ls -l foo bar
-rw------- 1 tommy tommy 0 2012-02-22 10:55 bar
-rw-rw-rw- 1 tommy tommy 0 2012-02-22 10:55 foo

再查看下现在的umask值:
$ umask
0022


UNIX系统的多数用户从不处理他们的umask值。它通常在登录时被shell的start-up文件设置一次,然后不再改变。尽管如此,当写创建新文 件的程序时,如果我们想保证特定的访问权限位被启用,我们则必须在进程运行时修改umask的值。比如,如果我们想要保证每个人都能读取一个文件,我们应 该设置umask为0。不然,当我们进程运行时,起效的umask值会导致权限位被关闭。


在前一个例子里,我们使用shell的umask命令在我们运行程序前后打印文件模式创建掩码。这给我们展示了改变一人进程的文件模式创建掩码不会影响它 父进程(通常是shell)的掩码。所有的shell都有一个内建的umask命令,我们可以用它来设置或打印当前的文件模式创建掩码。


用户可以设置umask值来控制他们创建的文件的默认权限。这个值以八进程表示,其中每个位表示一个屏蔽的权限,如下表所示:

umask的文件模式访问权限位
掩码位 含义
0400 用户读
0200 用户写
0100 用户执行
0040 组读
0020 组写
0010 组执行
0004 其他人读
0002 其他人写
0001 其他人执行

设置相应的位会否定权限。一些普遍的umask值为002,阻止其他人写你的文件,022阻止组成员和其他人写你的文件,027阻止组成员写你的文件以及阻止其他们读、写或执行你的文件。 单一UNIX规范要求shell支持umask命令的符号格式。不像八进制,符号格式指定哪些权限是被允许的(也就是说,清除文件创建掩码)而不是拒绝它(也就是设置文件创建掩码)。比较下面命令的两种格式:

$ umask
0022

$ umask -S
u=rwx,g=rx,o=rx

$ umask 027

$ umask -S
u=rwx,g=rx,o=
阅读(704) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~