code:unlink - ikarishinjieva/unixV6-code-analyze-chs GitHub Wiki
- 删除一个文件名(解除一个文件勾连)
- 若文件勾连数为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
- 获取 待删除文件所在目录的INODE指针(即该文件父目录的INODE指针) ,将其赋给pp
3516 if(pp == NULL)
3517 return;
- 若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");
3522 if((ip->i_mode&IFMT)==IFDIR && !suser())
- 若ip为空(不能找到待删除文件)
- 提示出错
3523 goto out;
3524 u.u_offset[1] =- DIRSIZ+2;
- 若待删文件为目录文件,且当前用户非超级用户
- 则不对待删除文件做任何操作,直接转到3532行(即非超级用户无法对目录文件做改动)
- 用法参看 文件系统#inode类型
3525 u.u_base = &u.u_dent;
- 将u_offset - 16,使得其指向待删除文件所在目录中的位置,原因参看namei函数之标志位说明
3526 u.u_count = DIRSIZ+2;
3527 u.u_dent.u_ino = 0;
3529 ip->i_nlink--;
- 将待删除文件所占的目录项的u_ino置位空,表明该目录项现为空闲状态
3530 ip->i_flag =| IUPD;
3531
- 待删除文件INODE勾连数 -1
- 待删除文件置 IUPD(被修改过标志)
3532 out:
3535 }
- 以上两句调用原因有2
- 1.将pp,ip的i_count 减1,因为3515行与3519行都间接或直接调用了iget函数,使得i_count +1,此处需要将其恢复
- 2.若被删除的文件勾连数为0了,则释放其磁盘上的INODE
3536 /* ------------------------- */
- (unlink = 10.)
- sys unlink; name