取消链接目录时会发生什么情况?
假设c.txt
位于目录b
。 unlink c.txt
很容易,系统只删除目录b
中的条目{XXX, c.txt}
。但是如果b
是a
的子目录,而我想取消链接b
会发生什么情况,程序是相同还是更复杂?取消链接目录时会发生什么情况?
从手册页之间的连结:
When the utility is called as unlink, only one argument,
which must not be a directory, may be supplied.
因此,在使用时取消链接,你不能将目录作为参数。
unlink(2)
只能删除一个文件,而rmdir(2)
只能删除空目录。
如果要递归删除目录,则必须智能地使用两个系统调用。您可能会发现许多不同的递归删除实现,例如this one正在使用nftw
,或者this one正在使用opendir
/readdir
。
假设我们有“a/b/c”,并且还有另一个“d/e”,其中e是c的硬链接,如果我们删除目录a及其子内容,那么e指向的是无效的? – stonestrong 2013-03-11 13:04:27
我提到“计算机系统设计原理”,在这种情况下,e最终会成为一个不具有破坏性的悬挂参考。 – stonestrong 2013-03-11 13:34:01
@stonestrong如果它是一个/符号/链接,它将以悬挂引用结束,但/ hardlink /将导致该文件的使用计数仍为1,因此文件仍然存在。你可以自己试试这个:'mkdir -p a/b; echo你好,世界\! > a/b/c; mkdir d; ln -s ../a/b/c d/e; ln a/b/c d/f; rm -rf a; cat d/e;猫d/f' – RolKau 2013-11-13 13:04:22
当谈到Unix文件系统为什么只允许指向文件的链接而不是目录时,'计算机系统设计原理'给出了一个取消链接目录的例子,它在第100页。如果这个例子不合适,有没有更好的解释? – stonestrong 2013-03-11 13:11:05