code:unlink - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki

Source

  • 删除一个文件名(解除一个文件勾连)
  • 若文件勾连数为0,则彻底删除该文件
  • 从用户态传入一个参数name
    • name:要删除的文件路径名

3505

3506 /*

3507  * Unlink system call.

3508  * panic: unlink -- "cannot happen"

3509  */

3510 unlink()

3511 {

3512     register *ip, *pp;

3513     extern uchar;

3514

3515     pp = namei(&uchar, 2);

  • 获取 待删除文件所在目录的INODE指针(即该文件父目录的INODE指针) ,将其赋给pp

3516     if(pp == NULL)

3517          return;

  • 若pp为空(找不到父目录),则直接返回

3518     prele(pp);

3519     ip = iget(pp->i_dev, u.u_dent.u_ino);

  • 若能找到其父目录INODE(pp不为空)
    • 解锁其父目录INODE
    • 获取待删除文件的INODE,将其赋给ip

3520     if(ip == NULL)

3521          panic("unlink -- iget");

  • 若ip为空(不能找到待删除文件)
    • 提示出错
3522     if((ip->i_mode&IFMT)==IFDIR && !suser())

3523          goto out;

  • 若待删文件为目录文件,且当前用户非超级用户
    • 则不对待删除文件做任何操作,直接转到3532行(即非超级用户无法对目录文件做改动)
  • 用法参看 文件系统#inode类型
3524     u.u_offset[1] =- DIRSIZ+2;
3525     u.u_base = &u.u_dent;

3526     u.u_count = DIRSIZ+2;

3527     u.u_dent.u_ino = 0;

3528     writei(pp);

  • 将待删除文件所占的目录项的u_ino置位空,表明该目录项现为空闲状态
3529     ip->i_nlink--;

3530     ip->i_flag =| IUPD;

  • 待删除文件INODE勾连数 -1
  • 待删除文件置 IUPD(被修改过标志)
3531

3532 out:

3533     iput(pp);

3534     iput(ip);

  • 以上两句调用原因有2
    • 1.将pp,ip的i_count 减1,因为3515行与3519行都间接或直接调用了iget函数,使得i_count +1,此处需要将其恢复
    • 2.若被删除的文件勾连数为0了,则释放其磁盘上的INODE
3535 }

3536 /* ------------------------- */

Ref

文件系统

Param

(unlink = 10.)
sys unlink; name
⚠️ **GitHub.com Fallback** ⚠️