stat函数、fstat和lstat函数
#include<sys/stat.h>
int stat(const char *restrict pathname,struct stat *restruct buf);
int fstat(int filedes,struct stat *buf);
int lstat(const char *pathname,struct sat *restrict buf);
三个函数的返回值:若成功则返回0,出错则返回-1。
一旦给出pathname,stat函数就返回与此命名文件有关的信息结构。fstat函数获取已在描述符filedes上打开的文件的相关的信息。lstat和stat类似,但当命名的文件时一个符号链接时,lstat返回该符号链接的有关的信息,而不是该符号链接引用文件信息。
第二个参数buf是指针,它指向一个我们必须提供的结构。其基本形式是:
struct stat{
mode_t st_mode;//文件的类型和权限
ino_t st_ino;//文件的i节点号
dev_t st_dev;
dev_t st_rdev;
nlink_t st_nlink;//文件的硬链接数
uid_t st_uid;//文件所有者ID
gid_t st_gid;//文件所有者所属组ID
off_t st_size;
time_t st_atime;//文件最后访问时间
time_t st_mtime;//文件最后一次的修改时间
time_t st_ctime;//文件状态最后一次修改时间
blksize_t st_blksize;
blkcnt_t st_blocks;
};
文件类型
(1)普通文件。这是最常用的文件这种文件包含了某种形式的数据。至于这种数据时文本还是二进制文件对于UNIX内核而言并无区别。
(2)目录文件。这种文件包含了其他文件的名字以及指向这些文件的指针。只有内核可以直接写文件。
(3)块特殊文件。这种文件类型提供对设备(例如磁盘)带缓冲的访问,每次访问以固定长度为单位进行。
(4)FIFO。这种类型文件用于进程间通信,也称为命名管道。
(5)字符特殊文件。这种文件提供不带缓冲的访问,每次访问的长度可变。系统中的所有设备要么是字符特殊设备要么是块特殊设备。
(6)套接字。这种文件类型用于进程间的网络通信。
(7)符号链接。这种文件指向另一个文件。
文件的类型信息包含在stat结构的st_mode成员中。
宏 文件类型
S_ISREG() 普通文件
S_ISDIR() 目录文件
S_ISCHR() 字符特殊文件
S_ISBLK() 块特殊文件
S_ISFIFO() 管道或FIFO文件
S_ISLINK() 符号链接
S_ISSOCK() 套接字
早期的UNIX系统版本并不提供S_ISXXX宏,而是将st_mode与屏蔽字S_IFMT进行逻辑“与”运算,然后与名为S_IFXXX的常量比较。就像如下的情况:
#define S_ISXXX(mode) (((mode)&S_IFMT)==S_IFXXX)