#include <sys/stat> /* 头文件 */ int stat(const char *restrict pathname, struct stat *restrict buf); int fstat(int fd, struct stat *buf); int lstat(const char *restrict pathname, struct stat *restrict buf); int fstat(int fd, const char *restrict pathname, struct stat *restrict buf, int flag); /* 函数成功返回0,失败返回-1; */ struct stat { /* stat结构体 */ mode_t st_mode; //文件对应的模式,文件,目录,权限等 ino_t st_ino; //i-node节点号 dev_t st_dev; //设备号码 dev_t st_rdev; //特殊设备号码 nlink_t st_nlink ;//文件的硬链接数 uid_t st_uid; //文件所有者 gid_t st_gid; //文件所有者对应的组 off_t st_size; //普通文件,对应的文件字节数 struct timespec st_atime; //文件最后被访问的时间 struct timespec st_mtime; //文件内容最后被修改的时间 struct timespec st_ctime; //文件状态(属性)改变时间 blksize_t st_blksize; //文件内容对应的块大小 blkcnt_t st_blocks; //文件内容对应的块数量 }
说明:
- 一旦给出pathname,stat函数将返回与此命名文件有关的信息结构
- fstat函数获得已在描述符fd上打开文件的有关信息
- lstat函数类似于stat,但是当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接引用的文件的信息
- fstatat函数为一个相对于当前打开目录(由fd参数指向)的路径名返回文件统计信息。flag参数控制着是否跟随着一个符号链接。
- 当AT_SYMLINK_NOFOLLOW标志被设置时,fstatat不会跟随符号链接,而是返回符号链接本身的信息。否则,在默认情况下,返回的是符号链接所指向的实际文件的信息。
- 如果fd参数的值是AT_FDCWD,并且pathname参数是一个相对路径名,fstatat会计算相对于当前目录的pathname参数。如果pathname是一个绝对路径,fd参数就会被忽略。这两种情况下,根据flag的取值,fstatat的作用就跟stat或lstat一样
实例:
1 #include"apue.h" 2 #include"my_err.h" 3 4 int main (int argc, char *argv[]) 5 { 6 int i; 7 struct stat buf; 8 char *ptr; 9 for (i = 1; i < argc; i++) 10 { 11 printf ("%s: ", argv[i]); 12 if (lstat(argv[i], &buf) < 0) 13 { 14 err_ret("lstat error"); 15 continue; 16 } 17 if (S_ISREG(buf.st_mode)) 18 ptr = "regular"; 19 else if (S_ISDIR(buf.st_mode)) 20 ptr = "directory"; 21 else if (S_ISCHR(buf.st_mode)) 22 ptr = "character special"; 23 else if (S_ISBLK(buf.st_mode)) 24 ptr = "block special"; 25 else if (S_ISFIFO(buf.st_mode)) 26 ptr = "fifo"; 27 else if (S_ISLNK(buf.st_mode)) 28 ptr = "symbolic link"; 29 else if (S_ISSOCK(buf.st_mode)) 30 ptr = "socket"; 31 else 32 ptr = "*** unknow mode ***"; 33 printf ("%s\n", ptr); 34 } 35 exit(0); 36 }
输出结果: