stat、fstat和lstat函數返回一個文件的有關信息。
函數聲明
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *path, struct stat *buf);
int fstat(int fd, struct stat *buf);
int lstat(const char *path, struct stat *buf);
函數說明
stat()獲取由path指定文件的信息。
lstat()類似於stat(),但是當path是一個符號鏈接時,它返回該符號鏈接的有關信息,而不是該符號鏈接引用的文件的信息。
fstat()獲取文件描述符爲fd的已打開文件的有關信息。
這些函數調用返回一個stat結構體,該結構體形式如下:
struct stat {
dev_t st_dev; /* ID of device containing file */
ino_t st_ino; /* inode number */
mode_t st_mode; /* protection */
nlink_t st_nlink; /* number of hard links */
uid_t st_uid; /* user ID of owner */
gid_t st_gid; /* group ID of owner */
dev_t st_rdev; /* device ID (if special file) */
off_t st_size; /* total size, in bytes */
blksize_t st_blksize; /* blocksize for file system I/O */
blkcnt_t st_blocks; /* number of 512B blocks allocated */
time_t st_atime; /* time of last access */
time_t st_mtime; /* time of last modification */
time_t st_ctime; /* time of last status change */
};
文件類型信息包含在stat結構體的st_mode成員中。使用下面的宏可確定文件類型,這些宏的參數都是stat結構體的st_mode成員。
S_ISDIR() 目錄;
S_ISCHR() 字符文件;
S_ISBLK() 塊文件;
S_ISREG() 普通文件;
S_FIFO() 管道或FIFO;
S_ISLNK() 符號鏈接;
S_ISSOCK() 套接字;
這些宏在/usr/include/sys/stat.h中定義:
/* Test macros for file types. */
#define __S_ISTYPE(mode, mask) (((mode) & __S_IFMT) == (mask))
#define S_ISDIR(mode) __S_ISTYPE((mode), __S_IFDIR)
#define S_ISCHR(mode) __S_ISTYPE((mode), __S_IFCHR)
#define S_ISBLK(mode) __S_ISTYPE((mode), __S_IFBLK)
#define S_ISREG(mode) __S_ISTYPE((mode), __S_IFREG)
#ifdef __S_IFIFO
# define S_ISFIFO(mode) __S_ISTYPE((mode), __S_IFIFO)
#endif
#ifdef __S_IFLNK
# define S_ISLNK(mode) __S_ISTYPE((mode), __S_IFLNK)
#endif
#if defined __USE_BSD && !defined __S_IFLNK
# define S_ISLNK(mode) 0
#endif
#if (defined __USE_BSD || defined __USE_UNIX98 || defined __USE_XOPEN2K) \
&& defined __S_IFSOCK
# define S_ISSOCK(mode) __S_ISTYPE((mode), __S_IFSOCK)
#elif defined __USE_XOPEN2K
# define S_ISSOCK(mode) 0
#endif
宏__S_IFDIR … __S_IFSOCK在/usr/include/bits/stat.h定義:
/* Encoding of the file mode. */
#define __S_IFMT 0170000 /* These bits determine file type. */
/* File types. */
#define __S_IFDIR 0040000 /* Directory. */
#define __S_IFCHR 0020000 /* Character device. */
#define __S_IFBLK 0060000 /* Block device. */
#define __S_IFREG 0100000 /* Regular file. */
#define __S_IFIFO 0010000 /* FIFO. */
#define __S_IFLNK 0120000 /* Symbolic link. */
#define __S_IFSOCK 0140000 /* Socket. */
通過sys/stat.h和bits/stat.h中的定義可將宏S_ISDIR()展開爲:
(((mode) & 0170000) == 004000
其它的宏展開類似。