Linux服务器开发之:stat(),fstat(),lstat()详细介绍+案例演示



1.依赖的头文件

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

2.函数定义:

//通过传入文件路径,struct stat结构体指针的方式

int stat(const char *path, struct stat *buf);

//通过文件描述符获取文件对应的属性。文件打开后这样操作
int fstat(int fd, struct stat *buf);

//通过文件描述符获取文件对应的属性。文件打开后这样操作
int lstat(const char *path, struct stat *buf);

说明:执行成功返回0,失败返回-1,错误代码存于errno

注意:

         给定一个path

         A:stat函数返回一个与此命名文件有关的信息结构

         B:fstat函数获得已在描述符filedes上打开的文件信息

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

3.这些函数的功能是返回关于一个文件的信息;

   A:stat既有命令也有同名函数,用来获取文件的Inode里主要信息,stat跟踪符号链接

   B:lstat不跟踪符号链接

4.stat里面时间辨析

   atime(最近访问时间)

   mtime(最近更改时间):指最近修改文件内容的时间

   ctime(最近改动时间):指最近改动Innode的时间,要注意的是mtime信息是Innode中的一项,所以一旦它修改了,这一项也会修改

5.所有的这些系统调用后返回一个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  连到该文件的硬连接数目,刚建立的文件值为1*/
               uid_t     st_uid;           /* user ID of owner   用户ID*/
               gid_t     st_gid;           /* group ID of owner 组ID*/
               dev_t     st_rdev;        /* device ID (if special file)  (设备类型)若此文件尾设备文件,则为其设备编号*/
               off_t     st_size;          /* total size, in bytes  文件字节数(文件大小)*/
               blksize_t st_blksize;  /* blocksize for filesystem I/O   块大小(文件系统的I/O缓冲区大小),类型为unsigned long类型*/
               blkcnt_t  st_blocks;   /* number of 512B blocks allocated  ,分配的512字节的块数,类型为unsigned long类型*/
               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   inode的更改时间*/
           };

6.通过下面的宏(macros)定义文件类型,下面的st_mode域包括以下几个部分:

           S_ISREG(m)  is it a regular file?                                      是否是一个常规文件

           S_ISDIR(m)  directory?                                                    是否是一个目录

           S_ISCHR(m)  character device?                                      是否是一个字符设备

           S_ISBLK(m)  block device?                                              是否是一个块设备

           S_ISFIFO(m) FIFO (named pipe)?                                   是否是输入输出(管道)   

           S_ISLNK(m)  symbolic link?  (Not in POSIX.1-1996.)      是否是符号链接

           S_ISSOCK(m) socket?  (Not in POSIX.1-1996.)              是否是socket

7.下面的flags为了这个st_mode域而定义的

           S_IFMT     0170000   bit mask for the file type bit fields   为bit域定义的位元掩码
           S_IFSOCK   0140000   socket                                          socket                                                        
           S_IFLNK    0120000   symbolic link                                  符号连接
           S_IFREG    0100000   regular file                                     常规文件
           S_IFBLK    0060000   block device                                   块设备
           S_IFDIR    0040000   directory                                          目录
           S_IFCHR    0020000   character device                            字符设备
           S_IFIFO    0010000   FIFO                                                先进先出


           S_ISUID    0004000   set-user-ID bit                                 文件的(set user-id on execution)位
           S_ISGID    0002000   set-group-ID bit (see below)           文件的(set group-id on execution)位
           S_ISVTX    0001000   sticky bit (see below)                      文件的sticky为


           S_IRWXU    00700     mask for file owner permissions     文件拥有者的掩码
           S_IRUSR    00400     owner has read permission             拥有者有读权限
           S_IWUSR    00200     owner has write permission            拥有者有写权限
           S_IXUSR    00100     owner has execute permission        拥有者有执行权限


           S_IRWXG    00070     mask for group permissions           组权限的掩码          
           S_IRGRP    00040     group has read permission             组有读权限

           S_IWGRP    00020     group has write permission            组有些权限
           S_IXGRP    00010     group has execute permission        组有执行权限


           S_IRWXO    00007     mask for permissions for others (not in group)      其它者(不在组中)的权限掩码
           S_IROTH    00004     others have read permission                                  其它者有读权限
           S_IWOTH    00002     others have write permission                                 其它者有写权限
           S_IXOTH    00001     others have execute permission                             其它者有执行权限

8.关于黏住位

          若一个目录具有sticky位(S_ISVTX) 则表示在此目录下的文件只能被文件所有者,次目录的所有者或者root来删除或修改

9.此外

struct statfs {
    long    f_type;           //文件系统类型
    long    f_bsize;         //块大小
    long    f_blocks;       //块多少
    long    f_bfree;         //空闲的块
    long    f_bavail;        //可用块
    long    f_files;           //总文件节点
    long    f_ffree;          //空闲文件节点
    fsid_t f_fsid;             //文件系统id
    long    f_namelen;    //文件名的最大长度
    long    f_spare[6];     //spare for later
};

10.stat()函数调用案例(通过程序的方式调用stat(),并且呈现 stat 结构体中的信息 )

运行结果:

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。