• Linux 系统IO函数之stat、lstat函数


    1、stat函数

    要点:
    int stat(const char *pathname, struct stat *statbuf);

    作用:查看文件的信息

    man 2 stat
    
    • 1

    在这里插入图片描述

    /return value
    
    • 1

    在这里插入图片描述

    1、stat结构体:

    在这里插入图片描述
    2、sturct stat 结构体中 st_mode 的含义(文件的类型和存取的权限):

    st_mode是个32位的整型变量,不过现在的linux操作系统只用了低16位(估计是鉴于以后拓展的考虑)
    
    • 1

    在这里插入图片描述

    File type 属性区域,位于bit12 ~ bit15	
    
    • 1

    在现代linux操作系统上文件类型共分为7种,分别是:

    1、普通文件(regular file)

    2、目录(directory)

    3、字符设备(character device)

    4、块设备(block device)

    5、管道(FIFO)

    6、符号链接文件(symbolic link)

    7、套接字文件(socket)

    详情看 sturct stat 结构体中 st_mode 的含义

    (st_mode & S_IFMT) == S_IFREG 通过与 掩码 与&运算 可以判断st_mode是不是一个普通文件

    总结:

    #include 
    #include 
    #include 
    
    int stat(const char *pathname, struct stat *statbuf);
        作用:获取一个文件相关的一些信息
        参数:
            - pathname:操作的文件的路径
            - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
        返回值:
            成功:返回0
            失败:返回-1 设置errno
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    测试:

    #include 
    #include 
    #include 
    #include 
    
    int main() {
    
        struct stat statbuf;
    
        int ret = stat("a.txt", &statbuf);
    
        if(ret == -1) {
            perror("stat");
            return -1;
        }
    
        printf("size: %ld\n", statbuf.st_size);
    
    
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    2、lstat函数

    要点:
    int lstat(const char *pathname, struct stat *statbuf);

    在这里插入图片描述

    软链接 lrwxrwxrwx b.txt -> a.txt

    petri@XX:~/lesson01/05_io$ touch a.txt
    petri@XX:~/lesson01/05_io$ ln -s a.txt b.txt
    
    petri@XX:~/lesson01/05_io$ ls -l
    total 2
    -rw-r--r-- 1 petri petri     0 Apr 22 18:34  a.txt
    lrwxrwxrwx 1 petri petri     5 Apr 22 18:35  b.txt -> a.txt
    
    petri@XX:~/lesson01/05_io$ stat b.txt
      File: b.txt -> a.txt
      Size: 5               Blocks: 0          IO Block: 512    symbolic link
    Device: 2h/2d   Inode: 212232132439866878  Links: 1
    Access: (0777/lrwxrwxrwx)  Uid: ( 1000/   petri)   Gid: ( 1000/   petri)
    Access: 2024-04-22 18:35:14.200056400 +0800
    Modify: 2024-04-22 18:35:14.200056400 +0800
    Change: 2024-04-22 18:35:14.200056400 +0800
     Birth: -
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    b.txt大小为 5 ,此时打开b.txt看到的其实是a.txt,因此stat b.txt获取的其实是它指向的文件的信息。
    l表示软连接,此时如果想获取b.txt的信息,就需要用到 lstat 这个函数了。

    int lstat(const char *pathname, struct stat *statbuf);
        参数:
            - pathname:操作的文件的路径
            - statbuf:结构体变量,传出参数,用于保存获取到的文件的信息
        返回值:
            成功:返回0
            失败:返回-1 设置errno
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    man 2 lstat
    
    • 1

    在这里插入图片描述

  • 相关阅读:
    CP Autosar——EthIf配置
    环境检测lims系统 环境检测行业实验室管理系统
    PHORHUM(CVPR2022)-3D重建论文解读
    【Qt控件之QListWidget】介绍及使用,利用QListWidget、QToolButton、和布局控件实现抽屉式组合控件
    从混合云到分布式云 (上篇)
    【uiautomation】获取微信好友名单,可指定标签 & 全部
    C++中的各种函数及用法(1)
    springboot+vue校园篮球比赛预约报名平台java maven
    径向基函数拟合
    Oracle19c安装以及问题汇总
  • 原文地址:https://blog.csdn.net/weixin_43349440/article/details/138076652