133 Linux 系统编程10 ,文件系统,inode,dentry,stat函数,lstat函数,access函数,chmod函数,truncate 函数,link函数,unlink函数,隐式回收

本文详细介绍了Linux文件系统中的关键概念,包括inode(文件属性管理结构)、dentry(目录项),以及stat、access、chmod、truncate、link和unlink等文件操作函数的原理和用法。重点讨论了硬链接、文件类型识别和权限控制等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一 文件存储相关概念,这和后面函数学习息息相关。

inode

前面我们学习过 使用 stat a.txt 去查看一个文件的属性,可以看到每个文件都一个Inode,从内容来看,像是一个 int,实际其本质为结构体

hunandede@hunandede-virtual-machine:~/projects/linuxcpp$ stat main.cpp
  File: 'main.cpp'
  Size: 6428      	Blocks: 16         IO Block: 4096   regular file
Device: 801h/2049d	Inode: 665076      Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/hunandede)   Gid: ( 1000/hunandede)
Access: 2024-02-24 12:44:27.250263847 +0800
Modify: 2024-02-24 12:44:26.662256231 +0800
Change: 2024-02-24 12:44:26.662256231 +0800
 Birth: -

其本质为结构体,存储文件的属性信息。如:权限、类型、大小、时间、用户、盘块位置……也叫作文件属性管理结构,大多数的inode都存储在磁盘上。

少量常用、近期使用的inode会被缓存到内存中。

dentry

目录项,其本质依然是结构体,重要成员变量有两个 {文件名,inode,...},而文件内容(data)保存在磁盘盘块中。

当我们增加 或者减少一个 "硬链接" 的时候,实际上就是 增加一个 dentry 或者减少一个 dentry

 注意 :当我们的dentry 被删除完毕后,磁盘上的区域并不会擦除。

即使是单纯的初始化也没有用。

那应该怎么擦除这些信息呢?把磁盘的这块区域重新写一遍就OK了,怎么知道是这块区域呢?

当然肯定有确定的办法, 但是还有笨办法,将你的磁盘重新写满,拷贝300集的 圣斗士星矢。

这就是 艳照门 事件 照片恢复的原理。

二 文件操作 stat函数  和 lstat 函数

lstat 不会穿透链接,意思是如果我们的文件是 软链接,使用 stat 函数获得的mode和 S_ISLNK宏函数 &,得到的不是 软链接,因为 stat函数 获得struct stat 中的mode 会指向软链接指向的真正的文件类型,但是lstat 不会。这个在后面有例子可以看出,这一行是学习到这个函数最后的时候的整理出来的,为了方便看,才提取到第一行,理论上应该放在最后一行。

函数原型:

获取文件属性,(从inode结构体中获取)

int stat(const char *path, struct stat *buf); 成返回0;失败返回-1 设置errno为恰当值。

参数:

参数1:文件名,文件路径

参数2:inode结构体指针 (传出参数),函数调用完毕后,会将file stat信息存在这个struct中

文件属性将通过传出参数返回给调用者。

返回值:

成功,返回0

失败,返回-1,errno被设置

stat 结构体的样子

  struct stat {
               dev_t     st_dev;         /* ID of device containing file */
               ino_t     st_ino;         /* inode number */
               mode_t    st_mode;        /* protection */
               nlink_t   st_nlink;       /* number of hard links */
               uid_t     st_uid;         /* user ID of owner
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值