首页 > 代码库 > Linux服务器开发之:stat(),fstat(),lstat()详细介绍+案例演示
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 结构体中的信息 )
运行结果:
Linux服务器开发之:stat(),fstat(),lstat()详细介绍+案例演示