python位运算实战(二)umask应用
上一篇《python位运算(一)概述》我们简单的总结了下位运算的几个种方法和使用技巧。本篇就结合实际应用来看下。适于用什么场景?下面我用 Unix 系统的umask概念来实践下位运算。简单来讲,Unix 系统对于文件的权限用 9 个权限位来控制:
1[-][rwx][r-x][r--]
2 1 234 567 890
- r: 可读 4
- w: 可写 2
- x: 可执行 1
- -: 表示此权限被去除
第一位是用来表示是文件还是目录,先不用管它,主要是后面 9 位。我们经常在授权是用的到644,755都是用r,w.x这三个值相加得出的。为什么值分别是4,2,1呢,我们把 go 语言sys包中的源码拿出来看看就明白了:
1const (
2 S_IRUSR = 0x100 //用户可读
3 S_IWUSR = 0x80 //用户可写
4 S_IXUSR = 0x40 //用户可执行
5 S_IRGRP = 0x20 //组可读
6 S_IWGRP = 0x10 //组可写
7 S_IXGRP = 0x8 //组可执行
8 S_IROTH = 0x4 //其它可读
9 S_IWOTH = 0x2 //其它可写
10 S_IXOTH = 0x1 //其它可执行
11)
这是 sys 包中定义的一些常量, 我们来打印下这些都是啥玩意
1fmt.Printf("%9b %3d %s\n", S_IRUSR, S_IRUSR, "用户读")
2fmt.Printf("%9b %3d %s\n", S_IWUSR, S_IWUSR, "用户写")
3fmt.Printf("%9b %3d %s\n", S_IXUSR, S_IXUSR, "用户执行")
4fmt.Printf("%9b %3d %s\n", S_IRGRP, S_IRGRP, "组读 *")
5fmt.Printf("%9b %3d %s\n", S_IWGRP, S_IWGRP, "组写 *")
6fmt.Printf("%9b %3d %s\n", S_IXGRP, S_IXGRP, "组执行")
7fmt.Printf("%9b %3d %s\n", S_IROTH, S_IROTH, "其它读 *")
8fmt.Printf("%9b %3d %s\n", S_IWOTH, S_IWOTH, "其它写 *")
9fmt.Printf("%9b %3d %s\n", S_IXOTH, S_IXOTH, "其它执行")
10// 输出
11100000000 256 用户可读
12 10000000 128 用户可写
13 1000000 64 用户可执行
14 100000 32 组可读
15 10000 16 组可写
16 1000 8 组可执行
17 100 4 其它可读
18 10 2 其它可写
19 1 1 其它可执行
看明白了吧,其实就是把九个权限位置分别标志为1,用二进制可以很清楚的表示权限位,4,2,1也就是这么来的。那么umask的就可以利用这个位运算,代码如下:
1package main
2 import (
3 "fmt"
4 "golang.org/x/sys/unix"
5 "os"
6 )
7 func main() {
8 unix.Umask(0)
9 _, err := os.Create("foo")
10 if err != nil {
11 fmt.Println("Create Error")
12 }
13 unix.Umask(unix.S_IRGRP | unix.S_IWGRP | unix.S_IROTH | unix.S_IWOTH)
14 _, err2 := os.Create("bar")
15 if err2 != nil {
16 fmt.Println("Create Error")
17 }
18 }
上面的代码可以看到,unix.S_IRGRP | unix.S_IWGRP | unix.S_IROTH | unix.S_IWOTH就利用了位运算,程序先后创建了两个文件foo,bar, 创建bar文件时,文件初始权限把组和其它中的可读和可写去除了,所以我们用ls -la foo bar命令可以看到输出如下:
1$ ls -la foo bar
2-rw-------. 1 vagrant vagrant 0 Oct 02 02:54 bar
3-rw-rw-rw-. 1 vagrant vagrant 0 Oct 02 02:54 foo
再用 9 个权限位的二进制图说明下:
1100000000 256 用户可读
2 10000000 128 用户可写
3 1000000 64 用户可执行
4 100000 32 组可读 *
5 10000 16 组可写 *
6 1000 8 组可执行
7 100 4 其它可读 *
8 10 2 其它可写 *
9 1 1 其它可执行
10 ---------
11 110110 unix.S_IRGRP | unix.S_IWGRP | unix.S_IROTH | unix.S_IWOTH
umask四个参数我用型号标出来了,那经过|位运算最终结果就是110110, 言外之意就是umask把标志为1的权限位去除了。umask使用二进制位来处理,一是节约了空间(9个字节,即两个比特位就表示了所有的权限组合)。如果给用户,组,其他各单独分权限用字符表示,至少要占用9个比特位(实际为了区分不同,可能要ur,uw,rx,gr,gw,gx,or,ow,ox这样两字节表示,实际要占用18个字节)。umask属于OS较底层的东西。在多个文件的情况,这个几位的在应用中对性能会有非常大的影响。
捐赠本站(Donate)
如您感觉文章有用,可扫码捐赠本站!(If the article useful, you can scan the QR code to donate))
- Author: shisekong
- Link: https://blog.361way.com/bitwise-umask/5783.html
- License: This work is under a 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议. Kindly fulfill the requirements of the aforementioned License when adapting or creating a derivative of this work.