C语言笔记-16-Linux基础-文件元数据
文章目录
- C语言笔记-16-Linux基础-文件元数据
- 前言
- 一、概述
- 二、ln 硬连接
- 三、软连接
- 四、stat 获取元数据
- 总结
前言
自学笔记,没有历史知识铺垫(省略百度部分)C语言笔记-16-Linux基础-文件元数据
一、概述
文件由meta+data组成
inode
结构体,meta中存储文件大小、文件描述、链接引用计数 等信息。
每个文件都有唯一的inode
节点,但是一个inode
节点可以映射多个文件。
ls -li
或ls -i
查看文件元数据.
硬连接和软连接区别
硬连接
- 同一个inode号指定多个文件名方式
- 不占用新的inode
- 不占用任何新的空间
- 对数据文件备份 防止误删除
- 不可以跨文件系统创建(即不能跨分区),如ln /boot/data/data.txt /home/data/data.txt 会报错
- 任意删除一个文件名,文件都不会损坏
软连接
- 快捷方式
- 占用新的inode号
- 占用少量的磁盘空间
- 可以跨文件系统创建
- 删除源文件后,软链接文件无效
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
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基础-文件元数据