首页 > 代码库 > APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍
APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍
以下不少内容来自man手册
结构体struct stat
结构体struct stat用于保存文件相关的所有信息。
struct stat的基本成员如下所示
struct stat {
dev_t st_dev; // 文件所在设备的设备id,可以分解为主设备号和此设备号
ino_t st_ino; // inode号
mode_t st_mode; // 文件的类型、存取权限等
nlink_t st_nlink; // 文件硬连接数
uid_t st_uid; // 文件拥有者的用户id
gid_t st_gid; // 文件拥有者的组id
dev_t st_rdev; // 特殊文件的设备id
off_t st_size; // 总的size,总字节数,用bytes计量
blksize_t st_blksize; // 文件系统I/O有效率的“首选”的块大小,进行I/O的块大小
blkcnt_t st_blocks; // 分配给文件块数量,以512-byte为单位,可能存在hole,所以可能小于st_size/512
time_t st_atime; // 最后访问的时间
time_t st_mtime; // 最后修改的时间
time_t st_ctime; // 最后一次发生状态改变的时间(如owner、mode、link数等等)
};
说明:
st_dev为unsigned int 类型,其中高12位为主设备号(用宏MAJOR(st_dev)获得),低20位为此设备号(用宏MINOR(dev_t dev)分解获取),
并不是所有的系统都支持st_atime st_mtime st_ctime全部的。
st_mode表示文件的模式、类型、存取权限。用特征位的形式表现。
mode_t实际上是一个unsigned short类型
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 socket
S_IFLNK 0120000 符号链接(symbolic link)
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置(block device)
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置(character device)
S_IFIFO 0010000 先进先出(fifo)
S_ISUID 0004000 文件的(set user-id on execution)位
S_ISGID 0002000 文件的(set group-id on execution)位
S_ISVTX 0001000 文件的sticky位
S_IRWXU 00700 文件所有者的遮罩值(即所有权限值)
S_IRUSR 00400 文件所有者具可读取权限
S_IWUSR 00200 文件所有者具可写入权限
S_IXUSR 00100 文件所有者具可执行权限
S_IRWXG 00070 用户组的遮罩值(即所有权限值)
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IRWXO 00007 其他用户的遮罩值(即所有权限值)
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限
要知道文件的类型,可以用文件的st_mode与特征位相与,在进行比较。比如我们要判断文件的是否为一般文件,可以用下面代码来判断
(buf.st_mode & S_IFREG) == S_IFREG
还有一种简单的方法可以获取文件的基本类型
S_ISREG(s_tmode) is it a regular file?
S_ISDIR(s_tmode) directory?
S_ISCHR(s_tmode) character device?
S_ISBLK(s_tmode) block device?
S_ISFIFO(s_tmode) FIFO (named pipe)?
S_ISLNK(s_tmode) symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(s_tmode) socket? (Not in POSIX.1-1996.)
stat,fstat和lstat
已知struct stat保存了文件几乎所有的信息,那么如何获取文件的stat呢? 函数stat(),fstat(),lstat(),fstatat()实现了获取文件stat结构的方法
#include <sys/stat.h>
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 fstatat(int fd,const char *restrict pathname,struct stat *restrict buf,int flag);
All four return: 0 if OK,?1 on error
stat()与获取一个路径的文件信息。
fstat()通过一打开的文件的文件描述符获取文件信息
lstat()通过路径获取文件的文件信息。如果该路径是一个符号链接,则获取该符号链接的文件信息,而不是其指向的文件。
fstatat() 提供了通过 相对于打开的文件描述符fd的 相对路径 来获取文件信息的方法。该函数有两个关键点:
1.也就是说,在fstatat()中,如果pathname使用的是相对路径,那么pathname是相对于fd的路径,而不是相对于当前目录。但是,如果fd被置为AT_FDCWD,那就是相对于当前目录了。
2.关于flag参数,如果flag被置为AT_SYMLINK_NOFOLLOW,那么fstatat就不追溯到符号链接所指向的具体文件,而是获取符号链接文件本身的文件信息。在默认情况下,会获取符号链接所链接的文件。
APUE学习笔记——4.2结构体 struct stat 及其相关函数介绍
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。