文件名就像一個指向真實數據的標籤。真實數據存儲在an inode。一個inode通常只有一個文件名指向它,鏈接數爲1。但它可以有多個。
下面是一個視覺示例。當您創建一個普通文件時,它會將您的數據放入一個新的inode中,並將文件名指向它。
$ echo "foo" > some/file
"some/file" -> [data: "foo", links: 1]
當你創建另一個文件時,會發生同樣的事情。
$ echo "bar" > another/file
"some/file" -> [data: "foo", links: 1]
"another/file" -> [data: "bar", links: 1]
但是,如果你犯了一個hard link,現在的inode有兩個環節。
$ ln some/file some/link
"some/file" -> [data: "foo", links: 2]
^
"some/link" -----/
"another/file" -> [data: "bar", links: 1]
事實上,正常的文件是硬鏈接。沒有什麼區別some/file
從some/link
除了文件名。兩者都不是「真正的」文件,它們都是鏈接。
如果鏈接被刪除,鏈接計數遞減。這就是爲什麼在某些語言中,您可以撥打unlink
來刪除文件。
$ rm some/file
"some/link" -> [data: "foo", links: 1]
"another/file" -> [data: "bar", links: 1]
當它達到0時,inode可以被覆蓋。數據仍然存在,但沒有指向它。這就是爲什麼你有時可以恢復被刪除的文件。
$ rm some/link
[data: "foo", links: 0]
"another/file" -> [data: "bar", links: 1]
怎麼樣的文件句柄?他們不會更改鏈接計數。相反,在Unix(而不是Windows)上,操作系統會跟蹤給定inode有多少打開的句柄。只要有一個打開的句柄,它就不會允許inode被覆蓋。
fd = open("another/file", O_RDWR);
[data: "foo", links: 0]
fd ---\
\/
"another/file" -> [data: "bar", links: 1]
$ rm another/file
[data: "foo", links: 0]
fd -> [data: "bar", links: 0]
close(fd);
[data: "foo", links: 0]
[data: "bar", links: 0]
這可以讓你做一些事情,如創建一個臨時文件,打開一個句柄來讀寫它,並立即刪除它。然後該程序可以繼續讀取和寫入臨時磁盤存儲,但沒有人可以看到該文件。
你對鏈接是什麼感到困惑,而不是關於「ls」。鏈接與文件句柄不同;這是一個單獨的參考信息被佔領的inode ... – tink