很多人认为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) |