#include <sys/types.h>#include <sys/stat.h>
i n t s t a t ( c o n s t c h a rp a*t h n a m e, s t r u c t s t a tb*uf) ;
i n t f s t a t ( i n tf i l e d e s, s t r u c t s t a tb*uf) ;
i n t l s t a t ( c o n s t c h a rp a t*h n a m e, s t r u c t s t a tb*uf) ;
三个函数的返回:若成功则为0,若出错则为- 1
给定一个p a t h n a m e,s t a t函数返回一个与此命名文件有关的信息结构,f s t a t函 数 获 得 已 在 描 述符f i l e d e s上打开的文件的有关信息。ls t a t函数类似于s t a t,但是当命名的文件是一个符号连接时,l s t a t返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息
使用 s t a t函数最多的可能是 ls -l 命令,用其可以获得有关一个文件的所有信息。
文件类型
至 今 我 们 已 介 绍 了 两 种 不 同 的 文 件 类 型— 普通文件和目录。U N I X 系 统 的 大 多 数 文 件 是普通文件或目录,但是也有另外一些文件类型:
(1) 普通文件(regularfile)。这是最常见的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据对于内核而言并无区别。对普通文件内容的解释由处理该文件的应用程序进行。
(2) 目录文件(directoryfile)。这种文件包含了其他文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读许可权的任一进程都可以读该目录的内容,但只有内核可以写目录文件。
(3) 字符特殊文件(characterspecial file)。这种文件用于系统中某些类型的设备。
有效用户I D 等于实际用户I D,有效组 I D等于实际组 I D。(4) 块特殊文件(block special file)。这种文件典型地用于磁盘设备。系统中的所有设备或者是字符特殊文件,或者是块特殊文件。
(5) FIFO。这种文件用于进程间的通信,有时也将其称为命名管道。14.5节将对其进行说明。
(6) 套接口( s o c k e t ) 。 这 种 文 件 用 于 进 程 间 的 网 络 通 信 。 套 接 口 也 可 用 于 在 一 台 宿 主 机 上 的进程之间的非网络通信。第1 5 章 将 用 套 接 口 进 行 进 程 间 的 通 信 。
(7) 符号连接( s y m b o l i c l i n k )。 这 种 文 件 指 向 另 一 个 文 件 。4 . 1 6 节 将 更 多 地 述 及 符 号 连 接 。
通常,有效用户 I D等于实际用户 I D,有效组 I D等于实际组 I D。
每个文件有一个所有者和组所有者,所有者由s t a t结构中的 s t _ u i d表示,组所有者则由s t _ g i d成员表示。
设置 -用户 - I D ( s e t - u s e r- I D )位和设置 -组- I D ( s e t - g r o u p - I D )位。再返回到s t a t 函 数 , 设 置- 用户- I D 位及设置- 组- I D位 都 包 含 在 s t _ m o d e 值 中 。 这 两 位 可 用 常数S _ I S U I D和 S _ I S G I D测试。
进程每次打开、创建或删除一个文件时,内核就进行文件存取许可权测试,而这种测试可
能涉及文件的所有者 ( s t _ u i d和 s t _ g i d ),进程的有效 I D (有效用户 I D和有效组 I D )以及进程的添加组 I D ( 若 支 持 的 话) 。 两 个 所 有 者I D 是 文 件 的 性 质 , 而 有 效I D 和添加组I D 则 是 进 程 的 性 质 。 内核进行的测试是:
(1) 若进程的有效用户I D 是0 ( 超级用户) , 则 允 许 存 取 。 这 给 予 了 超 级 用 户 对 文 件 系 统 进 行处理的最充分的自由。
(2) 若进程的有效用户I D 等于文件的所有者I D (也就是该进程拥有此文件 ):(a)若适当的所有者存取许可权位被设置,则允许存取。
(b) 否则拒绝存取。
适当的存取许可权位指的是,若进程为读而打开该文件,则用户-读位应为1;若进程为写而打开该文件,则用户-写位应为1;若进程将执行该文件,则用户-执行位应为1。
(3) 若进程的有效组I D或进程的添加组 I D 之一等于文件的组 I D:(a)若适当的组存取许可权位被设置,则允许存取。
(b) 否则拒绝存取。
(4) 若适当的其他用户存取许可权位被设置,则允许存取,否则拒绝存取。