C语言笔记-16-Linux基础-文件元数据

Linux文件元数据详解
本文深入探讨了Linux系统中文件元数据的概念,包括inode的作用及其如何存储文件信息。通过对比硬连接与软连接的特点,解释了这两种连接方式的工作原理及应用场景,并介绍了如何使用stat命令来获取文件的详细元数据。

C语言笔记-16-Linux基础-文件元数据



前言

自学笔记,没有历史知识铺垫(省略百度部分)C语言笔记-16-Linux基础-文件元数据


一、概述

文件由meta+data组成inode结构体,meta中存储文件大小、文件描述、链接引用计数 等信息。
每个文件都有唯一的inode节点,但是一个inode节点可以映射多个文件。
ls -li ls -i 查看文件元数据.

在这里插入图片描述

硬连接和软连接区别

硬连接

  1. 同一个inode号指定多个文件名方式
  2. 不占用新的inode
  3. 不占用任何新的空间
  4. 对数据文件备份 防止误删除
  5. 不可以跨文件系统创建(即不能跨分区),如ln /boot/data/data.txt /home/data/data.txt 会报错
  6. 任意删除一个文件名,文件都不会损坏

软连接

  1. 快捷方式
  2. 占用新的inode号
  3. 占用少量的磁盘空间
  4. 可以跨文件系统创建
  5. 删除源文件后,软链接文件无效
dony15$ ls -li
total 77328
#inode节点编号
 85273125 drwxr-xr-x   3 dony15  staff        96  5 13  2022 chiner
 99694886 drwxr-xr-x  66 dony15  staff      2112 12  2 09:04 csp
 99695194 drwxr-xr-x  16 dony15  staff       512 12  2 08:51 metrics
 69131869 drwxr-x--x   5 dony15  staff       160 11  1  2021 nacos
103071428 -rw-r--rwx   1 dony15  staff  39588967 11 29 09:08 ons.log

二、ln 硬连接

ln 源文件 新文件 硬链接,inode节点编码相同,两个文件实际上指向的同一个inode节点
ln source.txt target.txt

inode

dony15$ ln ons.log ons_bak

dony15$ ls -li
103071428 -rw-r--rwx   2 dony15  staff  39588967 11 29 09:08 ons.log
103071428 -rw-r--rwx   2 dony15  staff  39588967 11 29 09:08 ons_bak

三、软连接

ln -s 源文件 新文件 软链接
ln -s source.txt target.txt
快捷方式的方案
file3实际上存储file2的引用,file2指向真实的源inode
当file2删除,file3将无效

软连接

# 建立软链接
dony15$ ln -s ons_bak ons_bak2
dony15$ ls -li
103071428 -rw-r--rwx   2 dony15  staff  39588967 11 29 09:08 ons.log
103071428 -rw-r--rwx   2 dony15  staff  39588967 11 29 09:08 ons_bak
103610945 lrwxr-xr-x   1 dony15  staff         7 12  2 22:24 ons_bak2 -> ons_bak
# 删除软连接源文件
dony15$ rm -rf ons_bak
dony15$ ls -li
103071428 -rw-r--rwx   1 dony15  staff  39588967 11 29 09:08 ons.log
103610945 lrwxr-xr-x   1 dony15  staff         7 12  2 22:24 ons_bak2 -> ons_bak
# 软链接源文件删除后,目标文件将失效
dony15$ cat ons_bak2 
cat: ons_bak2: No such file or directory

# 重新创建ons_bak文件,ons_bak2将重新生效,并依旧软连接ons_bak,但是ons_bak与ons.log将再无关系
dony15$ echo "testABC">ons_bak
dony15$ cat ons_bak2
testABC

dony15$ ls -li
103071428 -rw-r--rwx   1 dony15  staff  39588967 11 29 09:08 ons.log
103611180 -rw-r--r--   1 dony15  staff         8 12  2 22:29 ons_bak
103610945 lrwxr-xr-x   1 dony15  staff         7 12  2 22:24 ons_bak2 -> ons_bak

四、stat 获取元数据

int stat(const char *pathname,struct stat *buf)

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

int main(int argc, char *argv[])
{
    struct stat sbuf;
    int r = stat(argv[1], &sbuf);
    if (r == -1)
    {
        perror("查看失败");
        return -1;
    }
    printf("inode: %llu \n", sbuf.st_ino);
    printf("inode nlink: %u \n", sbuf.st_nlink);
    return 0;
}
dony15$ ./ac.out test
inode: 103603039 
inode nlink: 1 

dony15$ ls -li
103603039 -rw-r--r--  1 dony15  staff     12 12  2 20:54 test

总结

本章主要为C语言笔记-16-Linux基础-文件元数据

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值