查询文件状态 -- stat、fstat、lstat

2014-07-17 13:30:38   最后更新: 2014-07-21 07:51:40   访问数量:536




int stat(const char *path, struct stat *buffer); int fstat(int fd, struct stat *buf); int lstat(const char *path, struct stat *buf);

 

 

定义于unistd.h中,stat结构体定义于sys/stat.h头文件中

 

一旦给出pathname,stat函数就返回与此命名文件有关的信息结构。

fstat函数获取已在描述符fd上打开的文件的有关信息

lstat函数类似于stat函数,但是当命名的文件是一个符号链接时,lstat返回该符号链接的有关信息,而不是由该符号链接所引用的文件的信息

 

第二个参数都是buf,是一个指针,它指向一个用户必须提供的结构,这些函数填写由buf指向的结构,该结构可能因为不同的实现会有所不同,但基本形式是:

struct stat {   dev_t st_dev; /* 文件所在设备的标识 */   ino_t st_ino; /* 文件结点号 */   mode_t st_mode; /* 文件模式,文件、目录等 */   nlink_t st_nlink; /* 硬连接数 */ uid_t st_uid; /* 文件用户标识 */   gid_t st_gid; /* 文件用户组标识 */   dev_t st_rdev; /* 文件所表示的特殊设备文件的设备标识 */   off_t st_size; /* 总大小,字节为单位 */   blksize_t st_blksize; /* 文件系统的块大小 */   blkcnt_t st_blocks; /* 分配给文件的块的数量,512字节为单元 */   time_t st_atime; /* 最后访问时间 */   time_t st_mtime; /* 最后修改时间 */   time_t st_ctime; /* 最后状态改变时间 */   };

 

事实上,ls -l 就是使用 stat 函数实现

 

e.g. 获取文件类型

#include "../apue.2e/include/apue.h" int main (int argc, char *argv[]) { int i; struct stat buf; char *ptr; for (i=1; i<argc; i++) { printf ("%s: ", argv[i]); if (lstat(argv[i], &buf) < 0) { err_ret ("lstat error"); continue; } if (S_ISREG(buf.st_mode)) ptr = "regular"; else if (S_ISDIR(buf.st_mode)) ptr = "directory"; else if (S_ISCHR(buf.st_mode)) ptr = "character special"; else if (S_ISBLK(buf.st_mode)) ptr = "block special"; else if (S_ISFIFO(buf.st_mode)) ptr = "fifo"; else if (S_ISLNK(buf.st_mode)) ptr = "symbolic link"; else if (S_ISSOCK(buf.st_mode)) ptr = "socket"; else ptr = "*** unknow mode ***"; printf ("%s\n", ptr); } return 0; }

 

 

如若使用 stat 函数,则结果中不会出现 symbolic link 这一项,因为 stat 函数会展开符号链接

 






读书笔记      技术帖      linux      unix      c语言      龙潭书斋      apue      unix环境高级编程      文件状态      stat      fstat      lstat     


京ICP备15018585号