• 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

    在这里插入图片描述

  • 相关阅读:
    京东卖点图怎么修改,批量修改卖点图教程
    STC8单片机PWM定时器+EC11编码器实现计数
    数据库表结构设计
    客户端和服务器之间的通信
    canvas图片自适应和居中显示
    BUUCTF——Basic题解
    神经网络训练电脑配置,cpu可以训练神经网络吗
    C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点
    PHP-函数(定义,带缺省值,值传递、地址传递)php跨越+移植(include require include_once require_once)
    不重启Docker能添加自签SSL证书镜像仓库吗?
  • 原文地址:https://blog.csdn.net/weixin_43349440/article/details/138076652