C/C++ struct stat介绍

news2024/12/21 23:05:59

目录

前言

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.coloradmin.cn/o/1844147.html

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

相关文章

Gobject tutorial 八

The GObject base class Object memory management Gobject的内存管理相关的API很复杂&#xff0c;但其目标是提供一个基于引用计数的灵活的内存管理模式。 下面我们来介绍一下&#xff0c;与管理引用计数相关的函数。 Reference Count 函数g_object_ref和g_object_unref的…

基于JSP的个人交友网站系统

开头语&#xff1a; 你好&#xff0c;我是计算机学长猫哥。在这个信息时代&#xff0c;个人交友网站为我们提供了一个便捷的社交平台。如果你对本系统感兴趣或有更多需求&#xff0c;欢迎联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;JSP技…

多线程(Lock锁,死锁,等待唤醒机制,阻塞队列,线程池)

Lock锁 虽然我们可以理解同步代码块和同步方法的锁对象问题但是我们并没有直接看到在哪里加上了锁&#xff0c;在哪里释放了锁为了更清晰的表达如何加锁和释放锁&#xff0c;JDK5以后提供了一个新的锁对象Lock Lock实现提供比使用synchronized方法和语句可以获得更广泛的锁定操…

网络编程(七)网络超时检测

文章目录 一、概念二、实现方式&#xff08;一&#xff09; 使用select实现超时检测1. select函数补充说明&#xff1a;2. 使用示例3. 输出结果 &#xff08;二&#xff09; 使用setsockopt函数1. 函数定义2. 获取发送缓冲区和接收缓冲区的大小3. 端口复用4. 设置超时时间 &…

每日复盘-202406020

今日关注&#xff1a; 20240620 六日涨幅最大: ------1--------300462--------- 华铭智能 五日涨幅最大: ------1--------300462--------- 华铭智能 四日涨幅最大: ------1--------300462--------- 华铭智能 三日涨幅最大: ------1--------300462--------- 华铭智能 二日涨幅最…

华为数通企业面试笔试实验题

1. 笔试题 1.1 实验拓扑 1.2 实验要求 公司A为小型销售公司,需要实现基本上网功能,蓝色部分为外网线,提供DHCP服务 DnsServer:114.114.114.114 帮助网管排查某一台计算机在某一台交换机的某个端口 2. 操作步骤 配置路由器相关的LAN侧接口IP地址 配置DHCP项,要求有PC1与PC2…

关于椭圆的方程(有Python画的动图)

关于椭圆的方程&#xff08;有Python画的动图&#xff09; flyfish 几何定义 椭圆是平面上所有到两个固定点&#xff08;焦点&#xff09;的距离之和为常数的点的集合。这两个固定点叫做焦点。 解析几何描述 设椭圆的两个焦点为 F 1 F_1 F1​ 和 F 2 F_2 F2​&#xff…

Redis学习|Redis主从复制、Redis哨兵模式、缓存穿透、缓存击穿、缓存雪崩概念和相应解决方法

Redis主从复制 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(master/leader)&#xff0c;后者称为从节点(slave/follower);数据的复制是单向的&#xff0c;只能由主节点到从节点。Master以写为主&#xff0c;Slave 以…

深度解读:如何运用600+标签精准构建企业画像、快速筛选高价值企业?

启信慧眼-启信宝企业版 近年来&#xff0c;信息安全越来越得到企业与公众的重视&#xff0c;数据库作为数据基础设施的关键部件&#xff0c;是保障关键信息基础设施安全的重要前提。数据库不仅为企业提供了数据存储和管理的基础设施&#xff0c;还通过数据分析、优化和扩展等功…

php反序列化的一些知识

问题 <?php $raw O:1:"A":1:{s:1:"a";s:1:"b";}; echo serialize(unserialize($raw)); //O:1:"A":1:{s:1:"a";s:1:"b";}?> php反序列化的时按理说找不到A这个类&#xff0c;但是他没有报错&#xff0c;…

conda install xformers -c xformers/label/dev 的安装问题

在StableSR项目框架中&#xff0c;需要执行 conda install xformers -c xformers/label/dev 但是报错&#xff0c;错误显示&#xff0c;版本不匹配&#xff0c;如下所示&#xff1a; 我改用pip来安装&#xff0c;好像就不报错了&#xff1a; pip install xformers

Django使用django-apscheduler实现定时任务

定时任务可以在后台定时执行指定的代码&#xff0c;避免了很多人为操作。下面是在Django项目中如何使用定时任务的具体操作流程。 我在这里使用的 django-apscheduler库来实现定时任务。 一、安装 django-apscheduler pip install django-apscheduler二、在项目的setting.py…

vivado TIMING_PATH

描述 定时路径由设计元素之间的连接来定义。在数字中 在设计中&#xff0c;时序路径是由一对受其控制的顺序元件形成的 或者通过两个不同的时钟来启动和捕获信号。 在典型的定时路径中&#xff0c;数据在一个内的两个连续单元之间传输 时钟周期。例如&#xff0c;启动边缘发生在…

‘xxxx‘ is a program, not an importable package

程序出现报错&#xff1a;‘xxxx’ is a program, not an importable package&#xff1a;“xxxx”是一个程序&#xff0c;而不是一个可导入的包 当程序出现这种报错提示的时候&#xff0c;首先第一点要做的就是需要使用到的某个方法/函数/结构体等所在的.go文件上面的packag…

音视频开发—RTMP推流详解

RTMP&#xff08;Real-Time Messaging Protocol&#xff0c;实时消息传输协议&#xff09;是一种用于音视频和数据在互联网进行实时传输的协议&#xff0c;最初由Macromedia&#xff08;现Adobe&#xff09;开发&#xff0c;用于与Adobe Flash Player进行通信。RTMP被广泛用于流…

成都晨持绪:新手开抖音网店什么品好做

在如今这个互联网高速发展的时代&#xff0c;抖音作为一款流行的短视频平台&#xff0c;已经成为许多创业者开展线上业务的首选之地。对于刚入行的新手来说&#xff0c;开设一个抖音网店既是一个机遇也是挑战&#xff0c;选择什么样的商品销售成为成功的关键因素之一。 首要的是…

数据库异常恢复2-备份文件恢复(快速恢复的手动启动方式)

(四) 备份文件备份恢复的概念 本次所说的数据恢复有异于数据的导入导出 1. 备份工具 gbase8s数据库提供了两种工具进行完成系统物理备份、逻辑日志备份和系统恢复&#xff1a;ontape和onbar ontape&#xff1a;提供了基本的系统物理备份、日志备份和恢复能力&#xff0c;其…

java实现分类下拉树,点击时对应搜索---后端逻辑

一直想做分类下拉&#xff0c;然后选择后搜索的页面&#xff0c;正好做项目有了明确的需求&#xff0c;查找后发现el-tree的构件可满足需求&#xff0c;数据要求为&#xff1a;{ id:1, label:name, childer:[……] }形式的&#xff0c;于是乎&#xff0c;开搞&#xff01; 一…

QT自定义标题栏窗口其二:实现拖动及可拉伸效果 + 顶部全屏/侧边半屏

1、效果 2、核心代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent<

管理咨询公司的五个招聘秘密

在管理咨询中&#xff0c;人是业务&#xff1b;客户支付数百万美元&#xff0c;要求管理顾问确认问题&#xff0c;并推荐解决方案。由于收入和合规性受到威胁&#xff0c;招聘错误的成本可能非常昂贵&#xff0c;一些公司更倾向于谨慎而不是效率。然而&#xff0c;在当今竞争激…