【Linux】文件系统之stat函数

本文介绍了Linux下使用stat、fstat及lstat函数获取文件状态的方法,并详细解析了struct stat结构体及其成员变量含义。此外,文章还提供了如何通过st_mode判断文件类型和权限的指南。
1、stat主要函数
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int stat(const char *path, struct stat *buf);
//在Linux中,可以利用stat()函数来获取一个文件的状态
//这个函数执行成功返回0,失败返回-1
//取得的文件状态存放在buf指针指向的struct stat结构提中
int fstat(int fd, struct stat *buf);
//fstat函数获得已在描述符上打开的文件的有关信息 
int lstat(const char *path, struct stat *buf);
//lstat函数类似于stat,但是当命名的文件是一个符号连接时
// lstat返回该符号连接的有关信息,而不是由该符号连接引用的文件的信息

2、认识stat结构体
struct stat {
    dev_t     st_dev;     /* 文件的设备编号 */
    ino_t     st_ino;     /* inode number */
    mode_t    st_mode;    /* 文件的类型和存取权限 */
    nlink_t   st_nlink;   /* number of hard links */
    uid_t     st_uid;     /* user ID of owner */
    gid_t     st_gid;     /* group ID of owner */
    dev_t     st_rdev;    /* device ID (if special file) */
    off_t     st_size;    /* 文件字节数 */
    blksize_t st_blksize; /* blocksize for filesystem I/O */
    blkcnt_t  st_blocks;  /* number of 512B blocks allocated */
    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 */
};

3、判断文件各类操作

st_mode是用特征位来表示文件类型的,特征位的定义如下:

S_IFMT0170000文件类型的位遮罩
S_IFSOCK0140000socket
S_IFLNK0120000符号链接(symbolic link)
S_IFREG0100000一般文件
S_IFBLK0060000区块装置(block device)
S_IFDIR0040000目录
S_IFCHR0020000字符装置(character device)
S_IFIFO0010000先进先出(fifo)
S_ISUID0004000文件的(set user-id on execution)位
S_ISGID0002000文件的(set group-id on execution)位
S_ISVTX0001000文件的sticky位
S_IRWXU00700文件所有者的遮罩值(即所有权限值)
S_IRUSR00400文件所有者具可读取权限
S_IWUSR00200文件所有者具可写入权限
S_IXUSR00100文件所有者具可执行权限
S_IRWXG00070用户组的遮罩值(即所有权限值)
S_IRGRP00040用户组具可读取权限
S_IWGRP00020用户组具可写入权限
S_IXGRP00010用户组具可执行权限
S_IRWXO00007其他用户的遮罩值(即所有权限值)
S_IROTH00004其他用户具可读取权限
S_IWOTH00002其他用户具可写入权限
S_IXOTH00001其他用户具可执行权限

判断文件类型时,用对文件的st_mode的值与上面给出的值相与,再比较。

还有一种简单的方法,利用系统提供好的宏直接比较:

功能
S_ISLINGK(st_mode)判断是否位符号链接
S_ISREG(st_mode)是否为一般文件
S_ISDIR(st_mode)是否为目录
S_ISCHR(st_mode)是否位字符装置文件
S_ISBLK(s3e)是否先进先出
S_ISSOCK(st_mode)是否为socket
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值