|
当使用 open 的 O_CREAT 标志创建一个文件时,第三个参数 mode 由标志的位运算 OR 组成,这些标志定义在 sys/stat.h 中。她们分别是:
S_IRUSER : 读权限,owner
S_IWUSER : 写权限,owner
S_IXUSER : 执行权限,owner
S_IRGRP : 读权限,group
S_IWGRP : 写权限,group
S_IXGRP : 执行权限,group
S_IROTH : 读权限,others
S_IWOTH : 写权限,others
S_IXOTH : 执行权限,others
open( "myfile", O_CREAT, S_IRUSR|S_IXOTH )
这里有两个因素可能影响到文件的权限。第一,只有在文件创建时才可以指定权限;第二,用户的掩码(mask)也会影响到创建的文件的权限。在 open调用给到的模式的值与用户的掩码(mask)的反码在运行时进行与(AND)操作。例如,如用户的掩码被设置为 001 ,并且 S_IXOTH模式标志被指定,则文件被创建时,不会有 “other”执行权限。因为用户掩码指定了“other”执行权限不会被提供。
umask
umask 是一个系统变量,是一个权限掩码的编码,这在文件被创建时用到,umask 命令可以改变这个变量的值。这个值是3个8进制值。每一位的值由1,2 或 4 这三个数字进行相加得到。每一位数分别对应着 "user", "group", "other" 。具体如下表所示:
----------------------------------------------------|
Digit Value Meaning |
1 0 没有禁止任何user权限 |
4 user 读权限禁止 |
2 User 写权限禁止 |
1 User 执行权限禁止 |
|
2 0 没有 group 权限被禁止 |
4 Group 读权限禁止 |
2 Group 写权限禁止 |
1 Group 执行权限禁止 |
|
3 0 没有 other 权限被禁止 |
4 Other 读权限被禁止 |
2 Other 写权限被禁止 |
1 Other 执行权限被禁止 |
----------------------------------------------------|
例如:
对创建的文件一开始就要禁止"group" 的写和执行权限,"other" 的写权限。umask 的值其实就是对每一位的相关位置或(ORed)起来,如第二位的就是 2 | 1 。于是 umask 的值为 032。
当通过 open 或 ceat 调用创建一个文件时,mode 上的参数若与当前的 umask 的设置向对应,那么这位在创建后就会被移出(遮挡起来)。 最后的结果是,尽管程序创建的文件要求有某些权限,但是实际可能并不会得到这些权限,这正是由于 umask 的存在!但这并不能阻止程序或者用户后来使用 chmod 命令(或在程序中使用 chmod 系统调用)来增加写权限;对于所有的新文件,这样的机制对用户保存这些文件,而避开不得不去检查和设置权限是很有帮助的。 |
|