關於檔案的INode與Java中的檔案操作介面

2021-09-07 20:44:03 字數 1381 閱讀 4460

本文由作者周梁偉授權網易雲社群發布。

近日做的專案中涉及到多程序共同讀寫多個檔案的問題,檔名和最後修改時間都是可能會被頻繁修改的,因而識別檔案的唯一性會產生相當的麻煩,於是專門再學習了一下檔案系統對檔案的組織管理方式。

前面說了檔案在磁碟上的存放是以inode-number為唯一id來區分的,在程序開啟乙個檔案讀寫時,作業系統又會為檔案分配乙個"指標"來訪問檔案,而不是直接使用inode-number。這個指標就是filedescriptor(下面簡稱fd),fd是乙個動態的概念,是程序中呼叫create後open檔案操作是返回的乙個long值,當檔案關閉時這個fd也就失效了,所以同乙個檔案如果被開啟兩次獲取到的fd會是不同的。程序開啟檔案的情況如下圖所示,在程序中維護了一張表記錄所有開啟的檔案,每一條記錄表示乙個filedescriptor,每個程序在開始時都預設開啟了三個檔案,filedescriptor分別是0,1,2,既stdin, stdout和stderr。fd記錄中包含了一張filetable,記錄了檔案的狀態資訊,offset和v-node指標,v-node指標才真正指向了磁碟上的檔案實體。(這裡的v-node是在inode之上抽象出來的概念,因為i-node在不同的檔案系統中會有實現上的差異,v-node是為了統一不同檔案系統的介面抽象出來的一層,在linux中v-node被稱為 filesystem independent inode ,而inode 稱為filesystem dependent inode,我們可以簡單的理解為 v-node就是inode)。

當乙個檔案被多個程序共享讀寫時,可以看如下圖:

最後需要注意的一點是,雖然在檔案的存續期間,inode可以認為是識別該檔案的唯一標識,但是檔案系統對inode有**重用的機制,在檔案被刪除之後,原來的inode可以被分配給新建立的檔案,這種情況下,如果一味以inode相同來判定新舊檔案是不是同乙個檔案可能會出現錯誤;應對這種情況確實也沒有更好的辦法,一種解決方法是,提取檔案中部分內容的md5或sha-1這種指紋資訊作為標識,以inode+md5是否相同來決定是否是同個檔案。

免費領取驗證碼、內容安全、簡訊傳送、直播點播體驗包及雲伺服器等**

Linux 檔案鎖與 inode

1.程序 a 排他鎖住某檔案之後,程序 b 可以修改該檔案,但不能鎖住該檔案。2.程序 a 排他鎖住某檔案之後,程序 b 修改該檔案之後,因為檔案 inode 沒有改變,所以依然不能鎖住該檔案。3.程序 a 排他鎖住某檔案之後,程序 b 可以刪除該檔案,並建立同名檔案,此時程序 b 可以鎖住該檔案。...

inode與block 檔案與目錄的關係

當我們在linux系統下建立乙個ext2的檔案或者目錄時,系統都會分配乙個inode和乙個block。其中inode用來儲存檔案的屬性資訊,指向對應block的pointer。block則是儲存檔案的具體內容。要注意的是,inode並不記錄檔名,只是記錄檔案的相關屬性,檔名是記錄在目錄所屬的bloc...

如何根據檔案的inode號查詢inode資料

1.根據ls i 檢視檔案的inode號 2.使用debugfs命令檢視檔案所在磁碟分割槽的超級塊資訊 debugfs dev sda2 debugfs stats inode count 5152768 block count 20590080 block size 4096 inode size...