对于用户空间的文件,我们使用ls –l查看会得到如下结果:
- drwxr-xr-x 3 root root 4096 2010-10-08 00:12 xxxx
第一个字符表示类型,接下来的rwx是文件的所有者root读该文件的操作权限,rwx即指拥有读写和执行的权限,如果为‘-’那么就没有该权限,接下来的-xr指root用户组中的其他用户对该文件的权限,最后的r-x指root用户组外的用户对该文件的操作权限。
当执行ls -l 或 ls -al 命令后显示的结果中,最前面的第2~10个字符是用来表示权限。第一个字符一般用来区分文件和目录:
d:表示是一个目录,事实上在ext2fs中,目录是一个特殊的文件。
-:表示这是一个普通的文件。
l: 表示这是一个符号链接文件,实际上它指向另一个文件。
b、c:分别表示区块设备和其他的外围设备,是特殊类型的文件。
s、p:这些文件关系到系统的数据结构和管道,通常很少见到。
第2~10个字符当中的每3个为一组,左边三个字符表示所有者权限,中间3个字符表示与所有者同一组的用户的权限,右边3个字符是其他用户的权限。这三个一组共9个字符,代表的意义如下:
r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。
w(Write,写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。
x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。
-:表示不具有该项权限。
下面举例说明:
-rwx------: 文件所有者对文件具有读取、写入和执行的权限。
-rwxr―r--: 文件所有者具有读、写与执行的权限,其他用户则具有读取的权限。
-rw-rw-r-x: 文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限。
drwx--x--x: 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录,却无法读取任何数据。
Drwx------: 除了目录所有者具有完整的权限之外,其他用户对该目录完全没有任何权限。
对于linux文件权限的更详细的文档参考:i.baidu.com/skyforum/blog/item/4219b72699f160168a82a1db.html
我们再看一下/proc下的文件:
- ls –l /proc
- ……
- dr-xr-xr-x 4 root root 0 2011-06-24 19:16 tty
- -r--r--r-- 1 root root 0 2011-06-24 19:16 uptime
- ……
显然,它们并没有特别之处。
在用户空间使用open类似的函数时,参数提供的权限模式为以下标志O_RDONLY 以只读方式打开文件;O_WRONLY 以只写方式打开文件;O_RDWR 以可读写方式打开文件。等。但只内核空间使用的是旗标,注意它们均为8进制表示。
它们位于stat.h (include/linux)中:
- #define S_IRWXU 00700 // RWX U(User)表示该文件的所有者权限为RWX
- #define S_IRUSR 00400 // R USR(User)表示该文件的所有者仅有读权限。
- #define S_IWUSR 00200 // W USR表示该文件的所有者仅有写权限。
- #define S_IXUSR 00100 // X USR表示该文件的所有者仅有执行权限。
- // 下面依次类推
- #define S_IRWXG 00070 // RWX G(Group)
- #define S_IRGRP 00040 // R GRP
- #define S_IWGRP 00020 // W GRP
- #define S_IXGRP 00010 // X GRP
- #define S_IRWXO 00007 //RWX O(Other)
- #define S_IROTH 00004 //R OTH(Other)
- #define S_IWOTH 00002 // W OTH(Other)
- #define S_IXOTH 00001 //X OTH(Other)
它们之间可以任意相或运算,以实现权限的叠加。比如:
- #define S_IRWXUGO (S_IRWXU|S_IRWXG|S_IRWXO) // 所有人都可读可写可执行
// SUID是特权位,可执行的文件搭配这个权限,便能得到特权,任意存取该文件的所有者能使用的全部系统资源。SGID是组特权位,设置在文件上面,其效果与SUID相同,只不过将文件所有者换成用户组,该文件就可以任意存取整个用户组所能使用的系统资源。
- #define S_IALLUGO (S_ISUID|S_ISGID|S_ISVTX|S_IRWXUGO)
- #define S_IRUGO (S_IRUSR|S_IRGRP|S_IROTH) // 所有用户均可读
- #define S_IWUGO (S_IWUSR|S_IWGRP|S_IWOTH) // 所有用户均可写
- #define S_IXUGO (S_IXUSR|S_IXGRP|S_IXOTH) // 所有用户均可执行
一些相关的宏定义解释如下,由于这些宏均是描述文件状态的,所以开头S指Stat之意。
#define S_IFMT 00170000 // IF:Identity Flag. MT: Type Mask , 也即第16-19bits指示文件类型,通过与运算S_IFMT可以得到文件类型:
- #define S_IFSOCK 0140000 // SOCK文件
- #define S_IFLNK 0120000 // 链接文件
- #define S_IFREG 0100000 // Regular file 常规文件
- #define S_IFBLK 0060000 // Block设备
- #define S_IFDIR 0040000 // 目录文件
- #define S_IFCHR 0020000 // Char设备
- #define S_IFIFO 0010000 // FIFO
- #define S_ISUID 0004000 // UID 位
- #define S_ISGID 0002000 // GID位
- #define S_ISVTX 0001000 // Sticky bit
所有文件的权限位均保存在对应的inode中的i_mode里,通常它被定义为unsigned short ,sizeof(i_mode)为2。16位的作用分别为:

- 00170000 => 0Xf000
- #define _S_IFMT 0xF000 /* file type mask */
- #define _S_IFDIR 0x4000 /* directory */
- #define _S_IFCHR 0x2000 /* character special */
- #define _S_IFIFO 0x1000 /* pipe */
- #define _S_IFREG 0x8000 /* regular */
- #define _S_IREAD 0x0100 /* read permission, owner */
- #define _S_IWRITE 0x0080 /* write permission, owner */
- #define _S_IEXEC 0x0040 /* execute/search permission, owner */