C/C++ struct stat介绍

目录

前言

struct stat

struct stat 使用

参考

共勉


前言

        本文详细介绍了stat结构体的成员变量,以及使用案例,希望能够帮到您。


struct stat

        struct stat 结构体用于表示文件或者文件系统对象信息的一种结构体的声明,通常在POSIX(Portable Operating System Interface)兼容的系统中使用,如Linux、macOS和许多UNIX变种。        

头文件

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

stat结构体原型(来源Centos 7 man 手册)

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 */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;    /* total size, in bytes */blksize_t st_blksize; /* blocksize for file system 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 */};

参数类型参数描述
dev_tst_dev;表示包含该文件的设备ID
ino_tst_ino;inode号,是文件在文件系统中的唯一标识符
mode_tst_mode;文件的类型和权限
nlink_tst_nlink;文件的硬链接数
uid_tst_uid;文件所有者的用户ID
gid_tst_gid;文件所有者的组ID
dev_tst_rdev;特殊设备的设备ID(如果文件是特殊文件)
off_tst_size;文件的大小(以字节为单位)
blksize_tst_blksize;文件系统I/O的块大小
blkcnt_tst_blocks;已分配的512字节块的数量
time_tst_atime;文件或目录最后一次被读取或访问的时间
time_tst_mtime;表示文件或目录的内容最后一次被修改的时间
time_tst_ctime;

表示文件或目录的状态最后一次被修改的时间

以下是一些常用的POSIX宏,用于检查st_mode字段中的文件类型:

功能
S_ISREG(m)检查m是否表示一个普通文件。
S_ISDIR(m)检查m是否表示一个目录。
S_ISCHR(m)检查m是否表示一个字符设备文件。
S_ISBLK(m)检查m是否表示一个块设备文件。
S_ISFIFO(m)或S_ISPIPE(m)检查m是否表示一个FIFO(命名管道)或管道文件。
S_ISLNK(m)检查m是否表示一个符号链接(在UNIX系统上)。
S_ISSOCK(m)检查m是否表示一个套接字(在某些系统上)。

以下是st_mode中定义的标志字段

S_IFMT0170000文件类型位字段的位掩码,
用于提取文件类型(file type)的掩码
文件类型标志码描述
S_IFSOCK0140000套接字
S_IFLNK0120000符号链接
S_IFREG0100000普通文件
S_IFBLK0060000块设备
S_IFDIR0040000目录
S_IFCHR0020000字符设备
S_IFIFO0010000命名管道
设置ID标志码描述
S_ISUID0004000设置用户ID,如果设置了此位,并且文件是可执行的,则运行该文件时,其有效用户ID将变为文件所有者的用户ID。这通常用于允许程序以特定用户的身份运行。
S_ISGID0002000设置组ID,如果设置了此位,并且文件是可执行的目录,则新创建的文件和子目录将继承该目录的组ID,而不是创建者的主组ID。如果文件是普通文件并且是可执行的,则效果与S_ISUID相似,但用于组ID。
S_ISVTX0001000粘滞位
权限掩码标志码描述
S_IRWXU00700文件所有者权限掩码
S_IRUSR00400拥有者有读权限
S_IWUSR00200拥有者有写权限
S_IXUSR00100拥有者有执行权限
S_IRWXG00070组权限掩码
S_IRGRP00040组具有读权限
S_IWGRP00020组具有写权限
S_IXGRP00010组具有执行权限
S_IRWXO00007其他权限掩码
S_IROTH00004其他具有读权限
S_IWOTH00002其他具有写权限
S_IXOTH00001其他具有执行权限

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);

        stat(),fstat(), lstat() 是Unix和类Unix系统中用于获取文件或目录状态信息的函数。这些函数之间的主要区别在于它们获取状态信息的方式以及它们处理符号链接(symbolic links)的方式。执行成功返回0失败返回-1并设置错误码。


stat()
        stat() 函数通过文件或目录的路径名(path)来获取其状态信息。如果路径名是一个符号链接,stat() 会跟随这个链接,返回链接指向的文件或目录的状态信息

fstat()
        fstat() 函数通过已打开的文件描述符(fd)来获取文件的状态信息。这意味着你必须已经使用如 open() 或其他相关函数打开了文件,并获取了文件描述符。fstat() 不会跟随符号链接,因为它直接作用于已打开的文件描述符

lstat()
        lstat() 函数也通过文件或目录的路径名(path)来获取状态信息。但是,与 stat() 不同,如果路径名是一个符号链接,lstat() 会返回符号链接自身的状态信息,而不是链接指向的文件或目录的状态信息。

错误码

错误码描述
EACCES调用进程没有足够的权限来访问路径中的某个目录,或者路径中的某个符号链接没有执行权限。
EBADF错误的文件描述符
EFAULT错误的地址
ELOOP在解析路径时遇到了太多的符号链接。
ENAMETOOLONG路径过长
ENOENT文件或目录不存在
ENOMEM系统无法为请求的操作分配足够的内存空间
ENOTDIR路径名不是一个目录
EOVERFLOW表示值太大无法放入指定类型的变量

下面就用stat()函数来举个例子

#include <iostream>
#include <unistd.h>
#include <sys/stat.h>using namespace std;int main()
{struct stat st;stat("./testLog.cc", &st); // 这里的.cc文件std::cout << "st.st_dev: " << st.st_dev << std::endl;std::cout << "st.st_ino: " << st.st_ino << std::endl;std::cout << "st.st_nlink: " << st.st_nlink << std::endl;std::cout << "st.st_uid: " << st.st_uid << std::endl;std::cout << "st.st_gid: " << st.st_gid << std::endl;std::cout << "st.st_size: " << st.st_size << std::endl;std::cout << "st.st_atime: " << st.st_atime << std::endl;std::cout << "st.st_mtime: " << st.st_mtime << std::endl;std::cout << "st.st_ctime: " << st.st_ctime << std::endl;switch (st.st_mode & S_IFMT){case S_IFSOCK:std::cout << "是套接字文件" << std::endl;break;case S_IFLNK:std::cout << "链接文件" << std::endl;break;case S_IFREG:std::cout << "是普通文件" << std::endl;break;case S_IFBLK:std::cout << "是块设备" << std::endl;break;case S_IFDIR:std::cout << "是目录" << std::endl;break;case S_IFCHR:std::cout << "是字符设备" << std::endl;break;case S_IFIFO:std::cout << "是命名管道" << std::endl;break;}return 0;
}


参考

        man手册: man 2 stat

        互联网


共勉

        以上就是我对stat结构体的认识。如果有什么疑问或者问题,欢迎评论区讨论或者私信我。可以的话请帮我点点赞和收藏,谢谢。


感谢阅读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/29278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mac M3 Pro 部署Flink-1.16.3

目录 1、下载安装包 2、解压及配置 3、启动&测试 4、测试FlinkSQL读取hive数据 以上是mac硬件配置 1、下载安装包 官网&#xff1a;Downloads | Apache Flink 网盘&#xff1a; Flink 安装包 https://pan.baidu.com/s/1IN62_T5JUrnYUycYMwsQqQ?pwdgk4e Flink 已…

【ComfyUI】Stable Diffusion 3 加Controlnet

基于 instantX-research/diffusers_sd3_control: &#x1f917; Diffusers: State-of-the-art diffusion models for image and audio generation in PyTorch and FLAX. (github.com) 和 ZHO-ZHO-ZHO/ComfyUI-SD3-Medium-CN-Diffusers: ComfyUI SD3-Medium ControlNet&#…

html入门综合练习

综合练习 通过实际项目练习可以更好地理解和掌握HTML、CSS和JavaScript。以下是几个综合练习项目的建议&#xff1a; 项目1&#xff1a;个人简历网页 创建一个包含以下内容的个人简历网页&#xff1a; 个人简介&#xff08;姓名、照片、联系方式&#xff09;教育背景工作经…

Survival Animations

一套生存游戏的动画集,包括采集、建造、捕鱼、剥皮/鞣制、篝火等更多内容。 总动画数:89 建造/制作 30 篝火 28 饮水 3 水壶 3 觅食 2 治疗 3 空闲 1 原始捕鱼 7 剥皮 1 矛捕鱼 4 伐木 5 下载:​​Unity资源商店链接资源下载链接 效果图:

[自动驾驶 SoC]-4 特斯拉FSD

FSD, 参考资料来源FSD Chip - Tesla - WikiChip 另外可参考笔者之前分享文章&#xff1a;[自动驾驶技术]-6 Tesla自动驾驶方案之硬件&#xff08;AI Day 2021&#xff09;&#xff0c;​​​​​​​[自动驾驶技术]-8 Tesla自动驾驶方案之硬件&#xff08;AI Day 2022&#xf…

Java多线程下载工具,多线程,多任务,断点续传,GUI

目录 一、题目要求 二、效果展示 三、功能实现 四、代码 一、题目要求 序号 功能名称 功能需求标识 简要描述 1 下载功能 Download 当用户输入一个下载链接后&#xff0c;能识别链接并开始多线程下载工作&#xff0c;包括线程监听、线程管理等。 2 续传功能 …

MMpose安装实例

摘要&#xff1a; 这个大数据训练发展较快&#xff0c;各种版本问题&#xff0c;不太好匹配&#xff0c;仅是安装就会大费周章。本文图文并茂的描述了一种成功的安装方式。仅供参考。 使用的win版本是win11&#xff0c;英伟达显卡是GeForce GTX 1660 SUPER。 1.cuda版本选择 通…

浏览器f12控制台怎么获取vue实例,并且修改data数据

我们在日常的生产工作中&#xff0c;经常会遇到一些问题&#xff0c;比如&#xff0c;若产品已经部署&#xff0c;或是目前无法查看源代码&#xff0c;或者向用命令直接修改查询默认表单数据&#xff0c;那我们怎么去查看Vue实例呢&#xff1f; 我们在浏览器直接打印this不能得…

基于JSP技术的弹幕视频网站系统

开头语 你好&#xff0c;你好呀&#xff0c;我是计算机学长猫哥&#xff01;如果有相关需求&#xff0c;可以通过文末的联系方式找到我。 开发语言 JSP 数据库 MySQL 技术 JSP JavaBeans 工具 MyEclipse、Tomcat、Navicat 系统展示 首页 用户登录界面 视频信息界面…

《跟我一起学“网络安全”》——等保风评加固应急响应

等保风评加固应急响应 一、安全加固 背景 随着IP技术的飞速发展&#xff0c;一个组织的信息系统经常会面临内部和外部威胁的风险&#xff0c;网络安全已经成为影响信息系统的关键问题。 虽然传统的防火墙等各类安全产品能提供外围的安全防护&#xff0c;但并不能真正彻底的消…

新闻稿标题怎么写吸引人?建议收藏

一个好的标题&#xff0c;不仅能激发读者的好奇心&#xff0c;还能引导他们继续深入了解文章内容。本文伯乐网络传媒将为你揭秘新闻稿标题写作的十大技巧&#xff0c;让你轻松写出吸引人的标题。 1. 激发好奇心 a. 提出疑问&#xff1a;以问句的形式提出问题&#xff0c;让读者…

C# Winform图形绘制

WinForms 应用程序中的控件是基于窗体的&#xff0c;当控件需要重绘时&#xff0c;它会向父窗体发送一个消息请求重绘。但是&#xff0c;控件本身并不直接处理绘制命令&#xff0c;所以你不能直接在控件上绘制图形。 解决方法&#xff1a; 重写控件的OnPaint方法使用CreateGr…

推荐3款轻量的window工具,免费好用

Rufus Rufus是一个制作U盘启动的工具&#xff0c;可以将window和linux操作系统制作成U盘启动&#xff0c;方便安装系统。 DesktopOK DesktopOK是一个电脑桌面图标备份工具&#xff0c;支持备份多个时间节点的桌面信息。一旦你的电脑桌面由于游戏或者其他软件导致你的桌面变得乱…

5.华为交换机局域网vlan网段隔离配置

目的:PC1与PC2互通 与PC3隔离 LSW1配置 [Huawei]vlan batch 10 20 [Huawei]int g0/0/1 [Huawei-GigabitEthernet0/0/1]port link-type access [Huawei-GigabitEthernet0/0/1]port default vlan 10 [Huawei-GigabitEthernet0/0/1]int g0/0/2 [Huawei-GigabitEthernet0/0/2]port…

C#调用OpenCvSharp和SkiaSharp绘制图像直方图

最近在B站上学习OpenCv教程&#xff0c;学到图像直方图&#xff0c;后者描述的是不同色彩在整幅图像中所占的比例&#xff08;统计不同色彩在图像中的出现次数&#xff09;&#xff0c;可以对灰度图、彩色图等计算并绘制图像直方图。本文学习OpenCvSharp中与计算直方图相关的函…

PS插件创成式填充功能全面测评:轻松实现AI修图新高度

大家好&#xff0c;我是你们的AIGC测评博主。今天&#xff0c;我将为大家带来一款ps插件创成式填充功能——深度体验 在图像处理领域&#xff0c;AI技术的应用已经越来越广泛。而创成式填充功能&#xff0c;无疑是其中的佼佼者。它利用AI技术&#xff0c;能够根据用户输入的关…

数据库系统概论(个人笔记)(第四部分)

数据库系统概论&#xff08;个人笔记&#xff09; 文章目录 数据库系统概论&#xff08;个人笔记&#xff09;4、中间的SQL4.1 连接表达式4.2 视图4.3 事务4.4 完整性约束4.5 SQL数据类型和模式4.6 SQL中的索引定义4.7 授权 4、中间的SQL 4.1 连接表达式 Join Expressions Join…

使用mysqldump导出mysql数据库的数据

使用mysqldump导出mysql数据库的数据 mysqldump是mysql自带的一个工具&#xff0c;路径一般是C:\Program Files\MySQL\MySQL Server 5.7\bin\mysqldump.exe 有点需要导出的数据库&#xff0c;选择导入/导出&#xff0c;选择用mysqldump导出 在使用 IntelliJ IDEA 通过 mysqldum…

车载ADAS面试题,零基础也能看得懂!

周一来刷刷ADAS相关的面试题吧&#xff01;相信看完这些题目&#xff0c;你会对ADAS有个更清晰的认识&#xff0c;即使你是零基础也可以轻松明白&#xff01; 1、描述 ADAS 系统的基本组成和功能 答案&#xff1a;高级驾驶辅助系统&#xff08;ADAS&#xff09;是一套融合了多种…

Mathtype插入word,以及mathtype在word上的卸载

1.Mathtype插入word 花了两个小时&#xff0c;最终得出的极品简单的安装方法&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; mathype下载地址&#xff1a;https://store.wiris.com/zh/products/mathtype/download/windows 下载完傻瓜式安装&#xff0c;不要…