【UNIX环境高级编程 第4章】函数stat、fstat、fstatat、和lstat

#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参数控制着是否跟随着一个符号链接。
  1. 当AT_SYMLINK_NOFOLLOW标志被设置时,fstatat不会跟随符号链接,而是返回符号链接本身的信息。否则,在默认情况下,返回的是符号链接所指向的实际文件的信息。
  2. 如果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 }

输出结果:

猜你喜欢

转载自www.cnblogs.com/sunbines/p/9347115.html