#include <sys/stat.h>
int stat(const char*pathname,struct stat*buf);
int fstat(int filedes,struct stat*buf);
int lstat(const char *pathname,struct stat*buf);
给予一个 pathname,stat 函数返回一个与此命名文件有关的信息结构, fstat 函数获得已在描述符 filedes 【由fileno函数获得】上打开的文件的有关信息。 lstat 函数类似于 stat, 但是当命名的文件是一个符号连接时, lstat 返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息。 ( 在 4.2) 节中当降序周游目录层次结构时,我们需要 lstat 。在 4.16 节中的较详细地说明符号连接。 )
lstat 函数不属于 POSIX10031-1990 标准,但很可能加到 10031a 中。 SVR4 和 4.3+BSD 支持 lstat 。
第二个参数是个指针, 它指向一个我们应提供的结构。这些函数填写由 buf 指向的结构。该结构的实际定义可能所实施而有所不同,但其基本形式是:
struct stat{
mode st_mode; /* 文件类型和方式 ( 许可数 )*/
ino st_ino;/* i- 节点号 ( 序列号 )*/
dev st_dev;/* 设备号 ( 文件系统 )*/
dev st_rdev;/* 特殊文件的设备号 */
nlink st_nlink;/* 连接数 */
uid st_uid;/* 属主的用户 ID*/
gid st_gid;/* 属主的组 ID*/
off st_size;/* 普通文件的字节长度 */
time st_atime;/* 最后存取时间 */
time st_mtime;/* 最后修改存取时间 */
time st_ctime;/* 最后文件状态更改时间 */
long st_blksize;/* 最佳 I/O 块长 */
long st_blocks;/* 分配的 512 字节块块数
};
POSIX.1 未定义 stdevstksige 和 stblocks 字段。 SVR4 和 4.3+BSD 则定义了这些字段。注意,除 最后两个以外,其它各成员都 ? 为基本系统数据类型 ( 见 2.7 节 ) 。我们将说明此结构的每个成员以了解文件属性。
stat 函数的最大 用户很可能是 ls-l 命令,用其可以获得有关一个文件的所有信息。
文件类型
至今我们已介绍了两种不同的文件类 型 - 普通文件和目录。 Unix 系统的大多数文件是普通文件或目录,但是也有另外一些文件类型:
1. 普通文件 (Regular file) 。这是最常见的文件类型,这种文件包含了某种形式的数据。至于这种数据是文本还是二进制数据对于系统核而言并无区别。对普通文件内容的解释由处 理该文件的应用程序进行。
2. 目录文件 (Directory file) 。这种文件包含了其它文件的名字以及指向与这些文件有关信息的指针。对一个目录文件具有读许可数的任一进程都可以读该目录的内容,但只有系统核 可以写目录文件。
3. 字符特殊文件 (Charocter special file) 。这种文件用于系统中的某些类型的设备。
4. 块特殊文件 (Block special file) 。这种文件典型地用于磁盘设备。系统中的所有设备或者是字符特殊文件,或者是块特殊文件。
5.FIFO 。这种文件用于进程间的通信,有时也将其称为命名管道。在 14.5 对其进行说明。
6. 套接口 (socket) 。这种文 件用于进程间的网络通信。套接口也可用于在一台宿主机上的进程之间的非网络通信。在第十五章,我们将用套接口进行进程间的通信。只有 4.3+BSD 才返回 套接口文件类型,虽然 SVR4 支持用套接口进行进程间通信,但现在是经由套接口函数库实现的,而不是通过系统核内的套接口文件类型,将来的 SVR4 版本可能会支持套接口文件类 型。
7. 符号连接 (Symboliclink) 。这种文件指向另一个文件。