linux删除文件说过程被执行,linux 文件删除过程浅析(上)

1.Linux文件删除原理

Linux是通过link的数量控制文件删除的,只有当文件不存在任何链接时,该文件才会被删除,一般每个文件有两个link计数器: i_count 和 i_nlink,从VFS inode结构体中可以找到:

0818b9ca8b590ca3270a3433284dd417.png

i_count: 引用计数器,文件被一进程引用,i_count数增加 ,可以认为是当前文件使用者的数量;

i_nlink: 硬链接数目(可以理解为磁盘的引用计数器),创建硬链接对应的 i_nlink 就会增加

对于rm命令来说,实际就是减少磁盘的引用计数 i_nlink 。如果当文件被另外一个进程调用时,用户执行rm命令删除文件,再去cat文件内容时就会找不到文件,但是调用该删除文件的那个进程却仍然可以对文件进行正常的操作。这就是因为 i_nlink 为 0 ,但 i_count 并不为 0 。只有当 i_nlink 和 i_count 均为 0 时,文件才会被删除(这里的删除是指将文件名到 inode 的链接删除了,但文件在磁盘上的block数据块并未被删除)。

首先使用strace追踪rm命令,看看rm具体使用了哪些系统调用:

0818b9ca8b590ca3270a3433284dd417.png

由上发现最终调用unlinkat系统调用删除文件。

2.系统调用unlinkat

unistd.h、unistd_64.h、unistd_32.h中定义系统调用号

0818b9ca8b590ca3270a3433284dd417.png

两个函数定义在 Namei.c 文件中,如下:

0818b9ca8b590ca3270a3433284dd417.png

在unlinkat函数定义中会判断flag标志,如果有设置AT_REMOVEDIR标志,说明删除的是目录则调用do_rmdir函数,否则调用do_unlinkat函数删除一个文件。

3.do_unlinkat函数

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

主要分为以下几个步骤:

0818b9ca8b590ca3270a3433284dd417.png

该函数中首先使用user_path_parent()函数获取要删除文件的父目录信息,成功会返回0,并且将父目录信息保存在nameidata类型的结构体nd中,然后通过lookup_hash函数在当前目录中找寻要删除文件的目录项信息,if语句判断获取的dentry是否有错误,有错误就使用path_put()和putname()释放前几步获取到的数据,然后返回,结束;若没有错误,得到该文件的inode,增加其i_count进程引用计数,判断当前挂载点是否有可写权限,有可写权限就调用vfs_unlink函数执行文件dentry的删除,释放dentry结构体,并释放资源,最后调用iput函数截断inode。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值