Linux系统statlstat函数

Posted 傅耳耳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux系统statlstat函数相关的知识,希望对你有一定的参考价值。

Linux系统—stat、lstat函数

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

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

1.1 stat 函数

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

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

在Linux系统中包含有stat 文件名 shell命令:

查看文件的相关信息

fuerer@fuerer-virtual-machine:~/Linux/lesson12$ touch a.txt
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ls
a.txt  stat.c
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ stat a.txt
  文件:a.txt
  大小:12        	块:8          IO 块:4096   普通文件
设备:801h/2049d	Inode:682288      硬链接:1
权限:(0664/-rw-rw-r--)  Uid:( 1000/  fuerer)   Gid:( 1000/  fuerer)
最近访问:2022-03-24 15:35:59.947966889 +0800
最近更改:2022-03-24 15:35:59.947966889 +0800
最近改动:2022-03-24 15:35:59.947966889 +0800
创建时间:-

文件信息

  • 文件名
  • 大小 12字节
  • 块:8 ——> 共占 8 个块
  • IO块:4096 ——> 一个块的大小为4096(共占了8个块)
  • 普通文件
  • 设备:801h/2049d ——> 设备标识
  • Inode:682288 ——> Linux中使用Inode标识文件
  • 硬链接:1 ——> 硬链接数
  • 权限:(0664/-rw-rw-r–)
  • Uid:( 1000/ fuerer) ——> 当前用户ID
  • Gid:( 1000/ fuerer) ——> 当前用户所在组ID
  • 最近访问
  • 最近更改 ——> 文件中内容数据、属性发生改变
  • 最近改动 ——> 文件的属性(例:权限…)发生改变
  • 创建时间

1.1.1 stat 结构体

保存文件的信息

struct stat 
    dev_t     st_dev;         //文件的设备编号     
    ino_t     st_ino;         //节点 Inode 
    mode_t    st_mode;        //文件的类型(7种类型和存取的权限)        
    nlink_t   st_nlink;       //硬链接数     
    uid_t     st_uid;         //用户ID        
    gid_t     st_gid;         //用户组ID         
    dev_t     st_rdev;    //设备文件的设备编号(如果是一个设备文件)  
    off_t     st_size;        //文件的字节数(文件大小) 
    blksize_t st_blksize;     //块大小   
    blkcnt_t  st_blocks;      //块数      

    struct timespec st_atim;  //最后一次访问时间
    struct timespec st_mtim;  //最后一次修改时间
    struct timespec st_ctim;  //最后一次改动时间(指属性)

    #define st_atime st_atim.tv_sec 
    #define st_mtime st_mtim.tv_sec
    #define st_ctime st_ctim.tv_sec
;

1.1.2 st_mode 变量

  • 16位
  • 使用标志位表示存取权限(有对应权限,为1)

1. 相关宏变量:

  • S_IROTH:Is Read others 0004(最后一组:100)
  • S_IWOTH:Is Write others 0002(最后一组:010)
  • S_IXOTH:Is Read others 0001(最后一组:001)
  • S_IRWXO:Is Read Write X others 0007(最后一组:111)

2. 文件类型(12-15位):

  • Linux系统一共7种文件类型,使用一个或多个标记位表示

3. 判断是否有某个权限:

  • 与相应的宏变量做 按位与 的操作(结果为1,有该权限)

4. 判断文件是否是某个类型:

  • 不是按位与,因为不是一个位表示一个类型
  • (st_mode & S_IFMT) == S_IFREG
    • 掩码 S_IFMT = 0170000 = 1111 0000 0000 0000B
    • st_mode & S_IFMT 得到文件类型的编码,与对应类型比较是否相等即可

1.2 stat 函数使用实例

编写stat.c 文件:

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

int main() 

    //1. 定义存放文件信息的结构体
    struct stat statbuf;

    //2. 调用stat函数获取文件信息,并存放在statbuf中
    int ret = stat("a.txt", &statbuf);

    if(ret == -1) 
        perror("stat");
        return -1;
    

    //3. 从statbuf中获取文件信息
    printf("size: %ld\\n", statbuf.st_size);

    return 0;

编译运行:

fuerer@fuerer-virtual-machine:~/Linux/lesson12$ gcc stat.c -o stat
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ./stat
size: 12
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ll
总用量 28
drwxrwxr-x  2 fuerer fuerer 4096 324 16:09 ./
drwxrwxr-x 13 fuerer fuerer 4096 324 15:33 ../
-rw-rw-r--  1 fuerer fuerer   12 324 15:35 a.txt
-rwxrwxr-x  1 fuerer fuerer 8496 324 16:09 stat*
-rw-rw-r--  1 fuerer fuerer 1229 324 16:09 stat.c

1.3 lstat 函数与 stat 函数区别

ln -s a.txt b.txt 创建软链接 b.txt -> a.txt

fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ln -s a.txt b.txt
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ls
a.txt  b.txt  stat  stat.c
fuerer@fuerer-virtual-machine:~/Linux/lesson12$ ll
总用量 28
drwxrwxr-x  2 fuerer fuerer 4096 324 16:10 ./
drwxrwxr-x 13 fuerer fuerer 4096 324 15:33 ../
-rw-rw-r--  1 fuerer fuerer   12 324 15:35 a.txt
lrwxrwxrwx  1 fuerer fuerer    5 324 16:10 b.txt -> a.txt
-rwxrwxr-x  1 fuerer fuerer 8496 324 16:09 stat*
-rw-rw-r--  1 fuerer fuerer 1229 324 16:09 stat.c

打开b.txt 实际打开的是 a.txt

  • 使用 stat 函数获取 b.txt 软链接的信息,获取的是其指向的 a.txt 文件的信息
  • 获取 b.txt 软链接的信息 ——> lstat 函数

以上是关于Linux系统statlstat函数的主要内容,如果未能解决你的问题,请参考以下文章

文件和目录详解---statlstat和fstat函数详解

Linux 进程资源用量监控和按用户设置进程限制

linux df查看硬盘使用量 du查看文件所占大小

Linux笔记 - 文件系统管理

python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间内存使用量内存占用率PID名称创建时间等;

Linux df和du命令