我正在編寫一個類似於Linux上的磁盤使用實用程序的程序,而且我在硬鏈接方面遇到了麻煩。C中的硬鏈接和它的程序之間的區別
我目前有程序在運行,它決定一個程序是否有硬鏈接。我使用stat()來確定這個文件。
if (st.st_nlink > 1)
當我運行此,無論是鏈接,它鏈接到程序恢復,但磁盤使用工具將只報告程序,而不是它的硬鏈接。
我該如何區分Linux中使用C的程序及其硬鏈接?
我正在編寫一個類似於Linux上的磁盤使用實用程序的程序,而且我在硬鏈接方面遇到了麻煩。C中的硬鏈接和它的程序之間的區別
我目前有程序在運行,它決定一個程序是否有硬鏈接。我使用stat()來確定這個文件。
if (st.st_nlink > 1)
當我運行此,無論是鏈接,它鏈接到程序恢復,但磁盤使用工具將只報告程序,而不是它的硬鏈接。
我該如何區分Linux中使用C的程序及其硬鏈接?
首先,你爲什麼不同的處理程序和數據與多個硬鏈接文件?
然後,重要的不是名稱或它們的編號(注意硬鏈接會爲文件添加另一個名稱),而是inode。對於具有多個硬鏈接的「文件」(即inode),指向同一個inode的所有名稱具有相同的權限(沒有「main」名稱,指向同一個inode的所有名稱都是等效的)。
因此在調用stat(2)系統調用之後,您希望使用st_dev
和st_ino
兩個字段。它們一起唯一標識一個文件,即它的inode。
因此,對於包含st.st_nlink>1
的文件,您可能會將(st_dev
,st_ino
)對添加到某個散列表或集合容器。
在C++中,你甚至可以使用一些std::set<std::pair<dev_t,ino_t> >
,但是在C中你必須創建這樣一個容器。
注意:文件(例如,一些索引節點),甚至可能爲零名稱(例如,如果一個系統調用unlink(2)
有open(2)
之後被調用),這是臨時文件是如何製造的。
嗯......我沒有得到使用這個預期的結果。我真正要問的是如何區分硬鏈接和它所對應的文件。當我運行這個時,我得到st_dev和st_ino都是相同的文件和硬鏈接爲我的測試用例。當這兩個文件彈出時,我怎麼能說「這個是硬鏈接」? –
重點是沒有一個「主」名和其他「奴隸」的名字!所有的硬名都是「平等的」。 –
所以不可能確定哪個是哪個? –