2013-04-18 72 views
0

我正在編寫一個類似於Linux上的磁盤使用實用程序的程序,而且我在硬鏈接方面遇到了麻煩。C中的硬鏈接和它的程序之間的區別

我目前有程序在運行,它決定一個程序是否有硬鏈接。我使用stat()來確定這個文件。

if (st.st_nlink > 1) 

當我運行此,無論是鏈接,它鏈接到程序恢復,但磁盤使用工具將只報告程序,而不是它的硬鏈接。

我該如何區分Linux中使用C的程序及其硬鏈接?

回答

2

首先,你爲什麼不同的處理程序數據與多個硬鏈接文件?

然後,重要的不是名稱或它們的編號(注意硬鏈接會爲文件添加另一個名稱),而是inode。對於具有多個硬鏈接的「文件」(即inode),指向同一個inode的所有名稱具有相同的權限(沒有「main」名稱,指向同一個inode的所有名稱都是等效的)。

因此在調用stat(2)系統調用之後,您希望使用st_devst_ino兩個字段。它們一起唯一標識一個文件,即它的inode。

因此,對於包含st.st_nlink>1的文件,您可能會將(st_dev,st_ino)對添加到某個散列表或集合容器。

在C++中,你甚至可以使用一些std::set<std::pair<dev_t,ino_t> >,但是在C中你必須創建這樣一個容器。

注意:文件(例如,一些索引節點),甚至可能爲零名稱(例如,如果一個系統調用unlink(2)open(2)之後被調用),這是臨時文件是如何製造的。

+0

嗯......我沒有得到使用這個預期的結果。我真正要問的是如何區分硬鏈接和它所對應的文件。當我運行這個時,我得到st_dev和st_ino都是相同的文件和硬鏈接爲我的測試用例。當這兩個文件彈出時,我怎麼能說「這個是硬鏈接」? –

+0

重點是沒有一個「主」名和其他「奴隸」的名字!所有的硬名都是「平等的」。 –

+0

所以不可能確定哪個是哪個? –

相關問題