今天跟大家分享的小技巧是跟“状态”有关的,我们在技巧四中已经讲述了利用数组转为其它形式的技巧。接下来我们来思考这样一个问题:想要为某一个文件设置一些权限,权限分为3种,分别是:可写“r”、可读“w”、可执行“x”。这3种权限可能同时存在,也可能同时不存在,也可能进行任意组合。我们先来说说一些不好的做法:可以将权限可能出现的所有情况做穷举,然后把所有的情况列出来分别用数字来表示。具体来说就是这样:
--- 0
r-- 1
rw- 2
rwx 3
-w- 4
-wx 5
--x 6
r-x 7
也就是说从0~7这8个数是xwr三种权限的组合,如果我们读取到状态的值是5,于是就需要到上面这张表中去查找5对应的权限是"-wx"也就是“可执行”、“可写”、“不可读”。如果我们想给这个文件分配一个“r-x”这样的权限仍然需要到上面这张表中去查找“r-x”对应的状态值是7。这种做法的结果是对的,逻辑也是对的,但做起来似乎有点麻烦,就目前看来还太明显。我们为了说明问题把上面据说的权限扩展一下:如果这个文件有3种所属角色:“所属用户”、“所属用户组”、“其他用户”,每一种角色都需要为其分配这个文件的“r”、“w”、“x”那么对于这些权限的组合有多少种呢?是2的9次方=512种,那么如果按照上面的穷举法就是将这个组合全部列出来,并将其由0到511进行编号。这样做的结果就会导致程序判断起来非常复杂,逻辑也有些不清晰。
那么好的做法是什么呢?我们来看一下这个权限问题的特点:每一个权限都是一个开关,我们如果用0表示关,用1表示开。于是无论哪一种权限,rwx的任何一个权限就可以用0和1来表示。我们知道冯诺依曼型计算机是二进制的,也就是说所有的数都是以二进行来存取,如果我们有一个数这个数在内存中是以bit位的形式来表示,也就是有若干个二进制位,每一个二进制位都可以是0或者1,也就是说这个数的每一个bit位都可以表示一个功能的开关。我们来看一下数字0和数字7
数字 二进制
0 000
1 001
2 010
3 011
4 100
5 101
6 110
7 111
如果我们把一个数的3个bit位的值分别用于我们的权限表示,也就是说从右向左看:
第1位的0/1表示“-/x”也就是是否可执行的权限。
第2位的0/1表示“-/w”也就是是否可写的权限。
第3位的0/1表示“-/r”也就是是否可读的权限。
于是,我们取得了一个权限的值,就可以采用位运算来对这些权限进行判断了:
if (chmod >> 0 & 1)
{
//x
}
if (chmod >> 1 & 1)
{
//w
}
if (chmod >> 2 & 1)
{
//r
}
我们再来看看高级权限部分,如果这个文件有3种所属角色:“所属用户”、“所属用户组”、“其他用户”,每一种角色都需要为其分配这个文件的“r”、“w”、“x”那么对于这些权限的处理办法就是使用3个八进制的数分别来表示“所属用户”、“所属用户组”、“其他用户”的权限:
rwx rwx r-x file1 chmod 755
rw- rw- r-- file2 chmod 664
这也是Linux文件系统中的权限设计,非常的高明、非常巧妙,它的原理就是例用bit位的0/1来表示某个功能的开关。
今天的小技巧你学会了吗?
Copyright © 2015-2023 问渠网 辽ICP备15013245号