stat函数

article/2025/10/8 17:06:04

文章目录

    • (一)struct stat 结构体
    • (二) st_mode 变量
    • (三) struct timespec 结构体


Linux 下可以使用 stat 命令查看文件的属性,其实这个命令内部就是通过调用 stat()函数来获取文件属性的,stat 函数是 Linux 中的系统调用,用于获取文件相关的信息,函数原型如下所示):

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char *pathname, struct stat *buf);

首先使用该函数需要包含<sys/types.h>、<sys/stat.h>以及<unistd.h>这三个头文件。
函数参数及返回值含义如下:
pathname:用于指定一个需要查看属性的文件路径。
buf:struct stat 类型指针,用于指向一个 struct stat 结构体变量。调用 stat 函数的时候需要传入一个 struct stat 变量的指针,获取到的文件属性信息就记录在 struct stat 结构体中。
返回值:成功返回 0;失败返回-1,并设置 error。

(一)struct stat 结构体

structstat 是内核定义的一个结构体,在<sys/stat.h>头文件中申明,所以可以在应用层使用,这个结构体中的所有元素加起来构成了文件的属性信息,结构体内容如下所示:

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; /* 设备号(指针对设备文件) */off_t st_size; /* 文件大小(以字节为单位) */blksize_t st_blksize; /* 文件内容存储的块大小 */blkcnt_t st_blocks; /* 文件内容所占块数 */struct timespec st_atim; /* 文件最后被访问的时间 */struct timespec st_mtim; /* 文件内容最后被修改的时间 */struct timespec st_ctim; /* 文件状态最后被改变的时间 */
};

st_dev:该字段用于描述此文件所在的设备。不常用,可以不用理会。
st_ino:文件的 inode 编号。
st_mode:该字段用于描述文件的模式,譬如文件类型、文件权限都记录在该变量中。
st_nlink:该字段用于记录文件的硬链接数,也就是为该文件创建了多少个硬链接文件。链接文件可以分为软链接(符号链接)文件和硬链接文件。
st_uid、st_gid:此两个字段分别用于描述文件所有者的用户 ID 以及文件所有者的组 ID。
st_rdev:该字段记录了设备号,设备号只针对于设备文件,包括字符设备文件和块设备文件,不用理会。
st_size:该字段记录了文件的大小(逻辑大小),以字节为单位。
st_atim、st_mtim、st_ctim:此三个字段分别用于记录文件最后被访问的时间、文件内容最后被修改的时间以及文件状态最后被改变的时间,都是 struct timespec 类型变量。

(二) st_mode 变量

st_mode 是 structstat 结构体中的一个成员变量,是一个 32 位无符号整形数据,该变量记录了文件的类型、文件的权限这些信息,其表示方法如下所示:在这里插入图片描述
O 对应的 3 个 bit 位用于描述其它用户的权限;
G 对应的 3 个 bit 位用于描述同组用户的权限;
U 对应的 3 个 bit 位用于描述文件所有者的权限;
S 对应的 3 个 bit 位用于描述文件的特殊权限。
这些 bit 位表达内容与 open 函数的 mode 参数相对应,这里不再重述。同样,在 mode 参数中表示权限的宏定义,在这里也是可以使用的,这些宏定义如下(以下数字使用的是八进制方式表示):

S_IRWXU 00700 owner has read, write, and execute permission
S_IRUSR 00400 owner has read permission
S_IWUSR 00200 owner has write permission
S_IXUSR 00100 owner has execute permission
S_IRWXG 00070 group has read, write, and execute permission
S_IRGRP 00040 group has read permission
S_IWGRP 00020 group has write permission
S_IXGRP 00010 group has execute permission
S_IRWXO 00007 others (not in group) have read, write, and execute permission
S_IROTH 00004 others have read permission
S_IWOTH 00002 others have write permission
S_IXOTH 00001 others have execute permission

譬如,判断文件所有者对该文件是否具有可执行权限,可以通过以下方法测试(假设 st 是 structstat 类型变量):

if (st.st_mode & S_IXUSR) {
//有权限
} else {
//无权限
}

这里我们重点来看看“文件类型”这 4 个 bit 位,这 4 个 bit 位用于描述该文件的类型,譬如该文件是普通文件、还是链接文件、亦或者是一个目录等,那么就可以通过这 4 个 bit 位数据判断出来,如下所示:

S_IFSOCK 0140000 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(管道文件)

注意上面这些数字使用的是八进制方式来表示的,在 C 语言中,八进制方式表示一个数字需要在数字前面添加一个 0(零)。所以由上面可知,当“文件类型”这 4 个 bit 位对应的数字是 14(八进制)时,表示该文件是一个套接字文件、当“文件类型”这 4 个 bit 位对应的数字是 12(八进制)时,表示该文件是一个链接文件、当“文件类型”这 4 个 bit 位对应的数字是 10(八进制)时,表示该文件是一个普通文件等。

所以通过 st_mode 变量判断文件类型就很简单了,如下(假设 st 是 struct stat 类型变量):

/* 判断是不是普通文件 */
if ((st.st_mode & S_IFMT) == S_IFREG) {
/* 是 */
}
/* 判断是不是链接文件 */
if ((st.st_mode & S_IFMT) == S_IFLNK) {
/* 是 */
}

S_IFMT 宏是文件类型字段位掩码:S_IFMT 0170000
除了这样判断之外,我们还可以使用 Linux 系统封装好的宏来进行判断,如下所示(m 是 st_mode 变 量):

S_ISREG(m) //判断是不是普通文件,如果是返回 true,否则返回 false
S_ISDIR(m) //判断是不是目录,如果是返回 true,否则返回 false
S_ISCHR(m) //判断是不是字符设备文件,如果是返回 true,否则返回 false
S_ISBLK(m) //判断是不是块设备文件,如果是返回 true,否则返回 false
S_ISFIFO(m) //判断是不是管道文件,如果是返回 true,否则返回 false
S_ISLNK(m) //判断是不是链接文件,如果是返回 true,否则返回 false
S_ISSOCK(m) #判断是不是套接字文件,如果是返回 true,否则返回 false

有了这些宏之后,就可以通过如下方式来判断文件类型了:

/* 判断是不是普通文件 */
if (S_ISREG(st.st_mode)) {
/* 是 */
}
/* 判断是不是目录 */
if (S_ISDIR(st.st_mode)) {
/* 是 */
}

(三) struct timespec 结构体

该结构体定义在<time.h>头文件中,是 Linux 系统中时间相关的结构体。应用程序中包含了<time.h>头文件,就可以在应用程序中使用该结构体了,结构体内容如下所示:

struct timespec
{time_t tv_sec; /* 秒 */syscall_slong_t tv_nsec; /* 纳秒 */
};

struct timespec 结构体中只有两个成员变量,一个秒(tv_sec)、一个纳秒(tv_nsec),time_t 其实指的就是 long int 类型,所以由此可知,该结构体所表示的时间可以精确到纳秒,当然,对于文件的时间属性来说,并不需要这么高的精度,往往只需精确到秒级别即可。

在 Linux 系统中,time_t 时间指的是一个时间段,从某一个时间点到某一个时间点所经过的秒数,譬如对于文件的三个时间属性来说,指的是从过去的某一个时间点(这个时间点是一个起始基准时间点)到文件最后被访问、文件内容最后被修改、文件状态最后被改变的这个时间点所经过的秒数。time_t 时间在 Linux下被称为日历时间,structstat 结构体中包含了三个文件相关的时间属性,但这里得到的仅仅只是以秒+微秒为单位的时间值,譬如可
以通过 localtime()/localtime_r()或者 strftime()来得到更利于我们查看的时间表达方式。

练习

(1)获取文件的 inode 节点编号以及文件大小,并将它们打印出来。
(2)获取文件的类型,判断此文件对于其它用户(Other)是否具有可读可写权限。
(3)获取文件的时间属性,包括文件最后被访问的时间、文件内容最后被修改的时间以及文件状态最后被改变的时间,并使用字符串形式将其打印出来,包括时间和日期、表示形式自定。

#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>int main(void) 
{struct stat file_stat;int ret;/* 获取文件属性 */ret = stat("./test_file", &file_stat);if (-1 == ret) {perror("stat error");exit(-1);}/* 打印文件大小和 inode 编号 */printf("file size: %ld bytes\n""inode number: %ld\n", file_stat.st_size,file_stat.st_ino);exit(0);
}

http://chatgpt.dhexx.cn/article/OAR0E0Ha.shtml

相关文章

Linux命令之stat命令

一、stat命令简介 stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。stat命令可以查看的信息包括&#xff1a; File&#xff1a;显示文件名Size&#xff1a;显示文件大小Blocks&#xff1a;文件使用的数据块总数IO Block&#xff1a;IO块大小r…

面经 - 计算机网络知识点

文章目录 资料协议层次应用层HTTP缓存机制强制缓存对比缓存 HTTP无状态Cookie & Sessioncookiesession DNS解析HTTP方法keep-alive和非keep-alive区别HTTP长连接和短连接HTTP方法GET和POST区别HTTP和HTTPS从地址栏输入URL到显示页面都发生了什么? HTTP3.0&#xff08;可靠…

计算机网络期末总复习知识点

概述 互联网的2个重要基本特点&#xff1a;连通性&#xff08;connectivity&#xff09;和资源共享&#xff08;sharing&#xff09;。端系统之间的两种通信方式&#xff1a;客户/服务器方式&#xff08;Client/Server方式、C/S方式&#xff09;、对等方式&#xff08;Peer to…

计算机网络基础知识点

1.网络介绍 由通信介质将地理位置不同、相互独立的计算机连接起来&#xff0c;实现数据和资源共享。 2.网络分类 2.1 按照拓扑结构分类 1.总线型 &#xff08;一根线上串好多计算机&#xff09;特点&#xff1a;两端信号终结器&#xff0c;分叉处有T型头 2.环形 网络效率…

计算机网络知识点总结-第一章:概述

1.计算机网络在信息时代的作用 互联网基本特点&#xff1a; 连通性&#xff1a;互联网上用户不管距离多远&#xff0c;都能通信&#xff0c;就像这些用户终端都彼此连通 共享性&#xff1a;指资源共享&#xff0c;包含信息、软件、硬件等共享&#xff0c;就像资源在用户身边 计…

计算机网络知识总结

目录 一&#xff1a;计算机网络分类 二&#xff1a;网络拓扑结构 三&#xff1a;ISO/OSI模型&#xff08;七层模型&#xff09; 四&#xff1a;五层模型 五&#xff1a;五层模型和七层模型对比 六&#xff1a;TCP/IP协议族 一&#xff1a;计算机网络分类 局域网&#xff…

计算机网络期末考试知识点汇总

一、TCP五层协议 1.体系结构 2.各层功能&#xff08;精简版&#xff09; 应用层:为应用程序提供各种功能&#xff0c;有各种协议表示层:数据格式转化&#xff0c;数据编码&#xff0c;解压&#xff0c;解密等会话层:建立&#xff0c;管理&#xff0c;维护会话&#xff0c;流量…

计算机网络知识整理-计算机网络概述(计算机网络入门参考指南)

第1章 计算机网络概述 1.1为什么要学习计算机网络 在当前的互联网时代&#xff0c;计算机网络已经成为了我国的一项重要的通信基础设施&#xff0c;无论是你是在校的计算机专业大学生&#xff0c;还是正在从事网络相关工作的从业人员&#xff0c;计算机网络的学习都是十分重要…

计算机网络知识点复习(适合春招面试复习)

计算机网络知识点 HTTP协议HTTP协议各版本之间的区别**HTTP1.0默认是短链接。****HTTP1.1默认持久连接。****HTTP2.0****HTTP3.0** HTTPS的过程HTTP是如何保存用户状态&#xff0c;Cookie和Session OSI体系结构TCP的三次握手和四次挥手三次握手四次挥手2MSL时间SYN泛洪攻击解决…

计算机网络知识点汇总(谢希仁 第七版)

目录 第一章 概述 重要内容 计算机网络的一些相关知识 互联网概述 因特网的标准化工作 互联网的组成 计算机网络的类别 计算机网络的性能指标 计算机网络的体系结构——-分层次的体系结构 第二章 物理层 重要内容 物理层的基本概念 数据通信的基本知识 信道复用技…

计算机网络知识点全面总结(有这一篇就够了!!!)

一、计算机网络概述 1.1 计算机网络的分类 按照网络的作用范围&#xff1a;广域网&#xff08;WAN&#xff09;、城域网&#xff08;MAN&#xff09;、局域网&#xff08;LAN&#xff09;&#xff1b; 按照网络使用者&#xff1a;公用网络、专用网络。 1.2 计算机网络的层次结…

计算机网络基本知识汇总

概述 OSI分层&#xff08;7层&#xff09; 物理层、数据链路层、网络层、运输层、会话层、表示层、应用层 TCP/IP分层&#xff08;4层&#xff09; 网络接口层、网络层、运输层、应用层 五层协议&#xff08;5层&#xff09; 物理层、数据链路层、网络层、运输层、应用层…

计算机网络知识

计算机网络的组成 IP&#xff1a; ip地址是有网络地址【前面部分】主机地址【后面部分】组成子网掩码&#xff1a;子网掩码和ip地址做&与运算&#xff0c;结果和ip一致的部分就是网络地址&#xff0c;结果不一致的表示网段范围默认网关&#xff1a;默认网关相当于你路由的…

计算机网络知识点汇总(王道)

目录 第 1 章 计算机网络概述 1.1 计算机网络的组成 1.2 计算机网络的分类 1.3 性能指标 1.3.1 带宽 1.3.2 吞吐量 1.3.3 时延 1.3.4 时延带宽积(链路容量) 1.3.5 往返时延RTT​ 1.3.6 利用率 1.4 分层结构 1.4.1 OSI参考模型&#xff08;7层&#xff09; 1.4.2 T…

计算机网络知识点总结提纲(谢希仁)

1、IOS/OSI对王道书上的缩减总结 (清晰pdf&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1f6DqMsHky4kP8i9WQLvCew?pwdthe3 提取码&#xff1a;the3 --来自百度网盘超级会员V3的分享) 2、王道书上物理层讲解的个人领悟之&#xff1a;奈氏准则和香浓定理 2.1 产生原…

计算机网络——计算机网络知识脑图

摘要 本博文主要分享计算机网络相关知识脑图&#xff0c;帮助大家更好的深入学习计算机网络相关知识&#xff0c;同时也介绍博主计算机网络专栏相关博文。同时介绍计算机网络学习书籍&#xff0c;有需要的小伙伴请自取。如果你觉得有用的话&#xff0c;请关注我的博客。 计算机…

计算机网络知识点总结

文章目录 一、概念1、什么是计算机网络&#xff1f;2、计算机网络协议、接口和服务的概念3、OSI与TCP/IP各层的结构与功能 二、物理层三、数据链路层四、网络层1、动态路由算法&#xff1a;距离-向量路由算法和链路状态路由算法2、网络地址转换&#xff08;NAT&#xff09;3、地…

计算机网络知识汇总(超详细整理)

文章目录 前言一、计算机网络概述1 互联网的构成2.网络分类3.接入网4.网络核心的两大功能①路由②转发 5.网络分层①OSI 7层模型②TCP/IP 4层模型③两种模型比较 二、物理层1.物理介质①引导型介质②非引导型介质 2.数据交换方式①分组交换②电路交换 3.信道复用①频分复用②时…

计算机网络知识点整理

目录 第一章&#xff1a;概述1. 五层协议2. 网络协议的三要素&#xff1a;3. 网络为什么要分层&#xff1f; 第二章&#xff1a;物理层1. 奈氏准则2. 香农定理3. 传输介质4. 四大特性 第三章&#xff1a;数据链路层1. 局域网2. 广域网3. CSMA/CD4. 以太网速率对比5. CSMA/CD与C…