假設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