- 概述:通过stat结构的每个成员以了解文件的所有属性,并说明修改这些属性的函数;介绍unix文件系统的结构以及符号链接、对目录进行操作的函数。
- stat.st_mode:包含文件类型、设置用户ID位和设置组ID位、文件访问权限这三类的信息;
- 文件的类型以及文件类型测试宏:
- 普通文件(exp:二进制可执行文件)
- 目录文件:包含其他文件的名字及指向与这些文件有关信息的指针(inode节点号?)
- 块设备特殊文件
- 字符设备特殊文件
- 套接字
- 符号链接
- 设置用户ID与设置组ID:使用常量S_ISUID、S_ISGID测试;由chmod、fchomod设置
- 与进程相关连的ID:
- 实际用户ID和实际组ID:用户标识登录的用户
- 有效用户ID、有效组ID和附加组ID:用户文件访问权限的检查
- 保存的设置用户ID和保存的设置组ID用于包含有效用户ID和有效用户组ID的副本
- 每个文件都有一个所有者与组所有者,分别由stat.st_uid和stat.st_gid保存
- 一般,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID
- 作用:当执行一个程序文件的时候,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID;但是当stat.st_mode的设置用户ID位被置位时,则进程的有效用户ID设置为此程序文件所有者的用户ID;设置用户组ID位的作用与此类似;
- 与进程相关连的ID:
- 文件的类型以及文件类型测试宏:
- 文件访问权限:9个访问权限
- 访问权限的规则:相见apue chap4 4.5,其中:
- 目录读权限:允许获得该目录中的所有文件名列表
- 目录执行权限:允许可以通过该目录(也就是搜索该目录,寻找一个特定的文件名,因此,有时执行位也称为搜索位)
- 内核中的访问权限测试规则(以下列出的顺序对应于相应的测试顺序):检查过程涉及到5中不同的ID,两个所有者ID是文件的性质,两个有效ID和附加组ID是进程的性质
- 进程的有效用户ID为0(超级用户),无权限限制
- 若进程的有效用户ID等于文件所有者ID,若所有者适当的访问权限被置位,则允许访问
- 若进程的有效用户ID或进程的附加组ID等于文件组ID,那么:若组适当的访问权限被置位,则允许访问
- 若其他用户适当的访问权限被置位,则允许访问
- 新文件与目录的所有权:
- 新文件用户ID(所有者)为进程有效用户ID
- 新文件组ID(组所有者),根据实现可分:1. 可以是进程的有效则ID;2.可以是它所在目录的组ID(继承下来)
- access函数:作用:以实际用户ID与实际组ID来测试文件的访问权限;其他函数一般以有效用户ID与有效组ID为基础来进行访问权限测试;
- umask:为进程设置文件模式创建屏蔽字(这意味着对于屏蔽字中位为1的位,在文件mode中相应的位一定被屏蔽),并返回以前的值;
- The typical default value for the process umask is S_IWGRP | S_IWOTH
(octal 022). In the usual case where the mode argument to open(2) is
specified as:
S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH
(octal 0666) when creating a new file, the permissions on the resulting
file will be:
S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH
(because 0666 & ~022 = 0644; i.e., rw-r--r--).
- The typical default value for the process umask is S_IWGRP | S_IWOTH
- chmod、fchmod设置文件的访问访问权限,条件:进程的有效用户ID必须等于文件的所有者ID,或是进程必须有超级用户权限;
- S_ISVTX粘住位:粘住位历史;现今的扩展:Single UNIX Specification允许对目录设置粘住位;如果对一个目录设置了粘住位,则只有对该目录具有写权限的用户在满足下列条件之一的情况下,才能删除或更名目录下的文件:1.拥有此文件2.拥有此目录3.是超级用户
- 文件长度:stat.st_size,只对普通文件、目录文件、符号链接有意义:已字节为单位的文件长度;可能在文件中存在空洞;空洞计入文件长度; 只是空洞不被实际存储;
- 文件系统:
-
- i节点的相关概念:i节点包含大多数文件的相关信息,如文件类型、文件的访问权限位、文件长度以及指向该文件所占用数据块的指针等,stat结构的大部分信息都取自i节点;文件的属性(i节点)及数据的分开存放(数据块);
- 目录项只存储两项信息:文件名,以及对应与此文件名的i节点编号
- i节点的链接计数:其值为指向该i节点的目录项数;只有当计数为0时,才实际的删除次文件;这样以i节点为基础的链接(即多个目录向指向通过一个i节点)称为硬链接; 硬链接使用的主要函数有link、unlink、remove、rename; 由于各个文件系统各自的对它们的i节点进行编号,那么就有可能出现同一个i节点的编号出现在多个文件系统中,因此不能使目录项指向另一个文件系统的i节点,即硬链接不能跨文件系统;在统一个文件系统中移动文件或更名时,文件的实际数据并不需要移动,只要构造一个指向此文件i节点的新目录项,然后删除此文件i节点与旧目录项的链接即可;
- 符号链接:被链接的文件的完整路径被保存在符号链接文件的数据块中,并且符号链接文件的文件类型为S_IFLNK;主要使用的函数:symlink、readlink
-
- 优点:1.可以跨越文件系统、可以链接到目录
- 特别要注意一些函数是否会处理符号链接,即跟随符号链接到达它所链接的文件;
- 文件时间:
- 注意st_ctime与st_mtime的区别:前者表示文件所对应i节点的修改时间,后者表示文件数据的修改时间;
- 设备特殊文件:
- stat.st_dev与stat.st_rdev的区别:
- 系统中的与每个文件关联的st_dev值是文件系统的设备号;该文件系统包含了这一文件名以及其对应的i节点
- 只有字符特殊文件和块特殊文件才有st_rdev值;此值包含实际设备的设备号
- stat.st_dev与stat.st_rdev的区别: