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.mfbz.cn/a/727508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

电子书(chm)-加载JS--CS上线

免责声明: 本文仅做技术交流与学习... 目录 cs--web投递 html(js)代码 html生成chm工具--EasyCHM 1-选择powershell 模式 生成 2-选择bitsadmin模式生成 chm反编译成html cs--web投递 cs配置监听器--->攻击---->web投递---> 端口选择没占用的, URL路径到时候会在…

前端下载文件流,axios设置responseType: arraybuffer/blob无效

项目中调用后端下载文件接口&#xff0c;设置responseType: arraybuffer,实际拿到的数据data是字符串 axios({method: post,url: /api/v1/records/recording-file/play,// 如果有需要发送的数据&#xff0c;可以放在这里data: { uuid: 06e7075d-4ce0-476f-88cb-87fb0a1b4844 }…

AtomicInteger原理和CAS与Synchronized(juc编程)

AtomicInteger原理 4.6.1 原理介绍 AtomicInteger的本质&#xff1a;自旋锁 CAS算法 CAS的全成是&#xff1a; Compare And Swap(比较再交换); 是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令。CAS可以将read-modify-write转换为原子操作&#xff0c;这…

vue小总结

知识总结 【 1 】es6 语法总结 # let 定义变量 # const定义常量 ------块级作用域---- # var 以后尽量少用&#xff0c;函数作用域var 在 JavaScript 中是函数作用域或全局作用域。而 let 和 const 是块级作用域。 // 使用 var 声明全局变量 var globalVar "Im a globa…

【机器学习】从理论到实践:决策树算法在机器学习中的应用与实现

&#x1f4dd;个人主页&#xff1a;哈__ 期待您的关注 目录 &#x1f4d5;引言 ⛓决策树的基本原理 1. 决策树的结构 2. 信息增益 熵的计算公式 信息增益的计算公式 3. 基尼指数 4. 决策树的构建 &#x1f916;决策树的代码实现 1. 数据准备 2. 决策树模型训练 3.…

DAB-DETR

论文地址&#xff1a; https://arxiv.org/pdf/2201.12329 文章通过前人的经验得出&#xff0c;导致 DETR 训练速度慢的原因很大可能是因为 decoder 中 cross attention 这个模块&#xff0c;由上面的对比可以看出其与 self attention 的区别主要就在于query的不同。文章猜想两个…

Java 8 Stream API介绍

Java 8引入了Stream API&#xff0c;这是对集合框架的一种增强&#xff0c;它允许你以一种声明式的方式处理数据集合。Stream API的核心在于将数据的操作分为两个主要阶段&#xff1a;中间操作和终端操作。中间操作返回的是一个新的Stream&#xff0c;可以链式调用多个中间操作…

C语言 图的基础知识

图 图的基本概念图的存储方法**邻接矩阵**&#xff1a;邻接表 图的遍历深度优先&#xff08;DFS&#xff09;广度优先&#xff08;BFS&#xff09; 最小生成树Prim算法Kruskal算法 最短路径问题 图的基本概念 图的定义&#xff1a; 图是由顶点的非空有穷集合与顶点之间关系&am…

opencv的RGB 颜色表

RGB&#xff08;255,23,140&#xff09;是光的三原色&#xff0c;也即是红绿蓝Red&#xff0c;Green&#xff0c;Blue&#xff0c;它们的最大值是255&#xff0c;相当于100%。 白色&#xff1a;rgb(255,255,255) 黑色&#xff1a;rgb(0,0,0) 红色&#xff1a;rgb(255,0,0) …

我的创作纪念日--码农阿豪

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

分支结构相关

1.if 语句 结构&#xff1a; if 条件语句&#xff1a; 代码块 小练习&#xff1a; 使用random.randint()函数随机生成一个1~100之间的整数&#xff0c;判断是否是偶数 import random n random.randint(1,100) print(n) if n % 2 0:print(str(n) "是偶数") 2.else语…

模拟原神圣遗物系统-小森设计项目,设计圣遗物(生之花,死之羽,时之沙,空之杯,理之冠)抽象类

分析圣遗物 在圣遗物系统&#xff0c;玩家操控的是圣遗物的部分 因此我们应该 物以类聚 人与群分把每个圣遗物的部分&#xff0c;抽象出来 拿 生之花&#xff0c;死之羽为例 若是抽象 类很好的扩展 添加冒险家的生之花 时候继承生之花 并且名称冒险者- 生之花 当然圣遗物包含…

返回给前端数据的封装

返回格式如下&#xff1a; { "code": 200/400, "msg": "成功"/"失败", "total": n, "data": [ {}&#xff0c;{}]} 1.在common中新增Result 类&#xff0c;代码如下 package com.xxx0523.common; import lombo…

【全网最全最详细】RabbitMQ面试题

一、说下RabbitMQ的架构大致是什么样的&#xff1f; RabbitMQ是一个开源的消息中间件&#xff0c;用于在应用程序之间传递消息。它实现了AMQP&#xff08;高级消息队列协议&#xff09;并支持其它消息传递协议&#xff0c;例如STOMP&#xff08;简单文本定向消息协议&#xff…

【机器学习】机器学习重要方法—— 半监督学习:理论、算法与实践

文章目录 引言第一章 半监督学习的基本概念1.1 什么是半监督学习1.2 半监督学习的优势 第二章 半监督学习的核心算法2.1 自训练&#xff08;Self-Training&#xff09;2.2 协同训练&#xff08;Co-Training&#xff09;2.3 图半监督学习&#xff08;Graph-Based Semi-Supervise…

蓝鹏测控公司全长直线度算法项目多部门现场组织验收

关键字:全场直线度算法,直线度测量仪,直线度检测,直线度测量设备, 6月18日上午&#xff0c;蓝鹏测控公司全长直线度算法项目顺利通过多部门现场验收。该项目由公司技术部、开发部、生产部等多个部门共同参与&#xff0c;旨在提高直线度测量精度&#xff0c;满足高精度制造领域需…

[SAP ABAP] 数据类型

1.基本数据类型 示例1 默认定义的基本数据类型是CHAR数据类型 输出结果: 示例2 STRING数据类型用于存储任何长度可变的字符串 输出结果: 示例3 DATE数据类型用于存储日期信息&#xff0c;并且可以存储8位数字 输出结果 提示Tips&#xff1a;日期和时间类型的变量可以直接进…

【数学建模】——【新手小白到国奖选手】——【学习路线】

专栏&#xff1a;数学建模学习笔记 目录 ​编辑 第一阶段&#xff1a;基础知识和工具 1.Python基础 1.学习内容 1.基本语法 2.函数和模块 3.面向对象编程 4.文件操作 2.推荐资源 书籍&#xff1a; 在线课程&#xff1a; 在线教程&#xff1a; 2.数学基础 1.学习内…

视频智能分析平台LntonAIServer安防监控视频平台行人入侵检测算法核心特点及其应用价值

LntonAIServer行人入侵检测算法是一种基于深度学习和计算机视觉技术的先进解决方案&#xff0c;旨在提高监控系统的智能化水平&#xff0c;有效预防未经授权的人员进入重要场所&#xff0c;保障安全生产和管理。以下是关于该算法的主要特点和应用的详细介绍&#xff1a; 核心特…

海外小米上架规则

一、应用创建 第1步&#xff1a;打开小米国际应用商店开发者站 &#xff0c;点击【分发】&#xff0c;登陆/注册开发者 1.1点击开发者站&#xff0c;点击【分发】 小米国际应用商店开发者站 地址&#xff1a;Mi Developer 1.2使用注册邮箱/手机号码/小米ID登录开发者账号 使…