Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1424029
  • 博文数量: 188
  • 博客积分: 1784
  • 博客等级: 上尉
  • 技术积分: 2772
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-05 22:20
个人简介

发上等愿,结中等缘,享下等福;择高处立,就平处坐,向宽处行。

文章分类

全部博文(188)

文章存档

2020年(12)

2019年(11)

2018年(4)

2017年(3)

2016年(11)

2015年(22)

2014年(19)

2013年(25)

2012年(32)

2011年(49)

分类: LINUX

2011-05-12 18:28:02

很多人认为umask掩码就是我们创建文件时它用777-022 就得出来了755,这完全是误导人的答案,不负一点责任的回答!最后随便举个例子就把这种方法推翻了。

Shell进程的umask掩码可以用umask命令查看:

$ umask 0022

用touch命令创建一个文件时,创建权限是0666,而touch进程继承了Shell进程的umask掩码,所以最终的文件权限是0666&~022=0644。

$ touch file123
$ ls -l file123 -rw-r--r-- 1 akaedu akaedu 0 2009-03-08 15:07 file123

同样道理,用gcc编译生成一个可执行文件时,创建权限是0777,而最终的文件权限是0777&~022=0755。

$ gcc main.c
$ ls -l a.out -rwxr-xr-x 1 akaedu akaedu 6483 2009-03-08 15:07 a.out
这是怎么计算的呢,让我们来看一下他的计算过程,需要用到反码和求与运算。
系统中默认情况下创建的掩码为022,
我拿创建一个可执行文件main.c来说,它的初始权限为0777
000 010 010                                              掩码022的二进制8421码
111 101 101                                              掩码022的反码
111 111 111                                              main.c权限的二进制8421码
把掩码022的反码和 main.c权限的二进制8421码做与运算为
111 101 101                                              也就是755
再举一个列子
创建一个文件d, 它的初始权限是0666
000 010 010                                              掩码022的二进制8421码
111 101 101                                              掩码022的反码
110 110 110                                              文件d权限的二进制8421码
做与运算为
110 100 100                                              也就是644
我再来举个列子把那个错误的分析推翻

现在我们自己写一个程序,在其中调用open("somefile", O_WRONLY|O_CREAT, 0664);创建文件,然后在Shell中运行并查看结果:

$ umask 022 $ ./a.out $ ls -l somefile -rw-r--r-- 1 akaedu akaedu 6483 2009-03-08 15:11 somefile
不出所料,文件somefile的权限是0664&~022=0644。
文件somefile 创建时权限为664,如果按照那种误导的方法经过掩码后不是该为642了么,显然是错误的。
正确的算法是
000 010 010                                              掩码022的二进制8421码
111 101 101                                              掩码022的反码
110 110 100                                              文件somefile权限的二进制8421码
做与运算后为
110 100 100                                              也就是644
这才是正确的算法
我的博客http://wylong.blog.chinaunix.net
阅读(2423) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~