13.4.17 链接/解链的实现
参见图13-24(和图13-7一样)有助于理解内核为了实现链接这个系统调用要做的工作。假定要链接和共享的文件是目录C1中的F1,在目录A1中该文件被称作A12。
![]() |
(点击查看大图)图13-24 链接 |
然后,内核按照如下步骤实现该系统调用:
(1) 如果用户不是超级用户,输出错误消息并退出(只有超级用户可以执行该系统调用)。
(2) 解析现有路径名/A/A1/A12从而得到要链接的文件的索引节点。存储该索引节点以备将来使用。
(3) 访问该索引节点记录。
(4) 将索引节点中"链接数"字段递增1。
(5) 为了保持一致性,将该索引节点写回到磁盘上。
(6) 解析路径名/C/C1,从而得到该目录的索引节点,并读取该目录的内容。
(7) 在确保名字为F1的文件已经不在该目录中后,找出该目录中的一个空闲条目。如果没有空闲条目,就输出错误消息并退出。
(8) 在目录/C/C1中为被链接的名字为F1的文件以及在步骤(2)中存储的索引节点号生成一个条目。
(9) 写回所有的目录。这就完成了整个链接过程。
解链用的算法与此相似,容易构造,但要注意的是:这些算法看上去让人觉得很简单,但实际上由于在运行期间可能会出现死锁和竞争条件而导致它们非常复杂。关于死锁和竞争条件的完整讨论超出了本书研究范围,不再介绍。