linux 空洞檔案

2021-08-17 22:43:09 字數 691 閱讀 7345

我們都知道 lseek() 系統呼叫可以改變檔案的偏移量,但如果程式呼叫使得檔案偏移量跨越了檔案結尾,然後再執行 i/o 操作,將會發生什麼情況? read() 呼叫會返回 0, 表示檔案結尾。write() 呼叫可以在檔案尾後的任意位置寫入資料。在這種情況下,對該檔案的下一次寫將延長該檔案,並在檔案中構成乙個空洞,這一點是允許的。從原來的檔案結尾到新寫入資料間的這段空間被稱為檔案空洞。

檔案空洞不占用任何磁碟空間,知道某個時點,在檔案空洞中寫入了資料,檔案系統才會為之分配磁碟塊。空洞的存在意味著乙個檔案名義上的大小可能比其占用的磁碟儲存總量要大(有時大出很多)。向檔案空洞中寫入位元組,核心需要為其分配儲存單元,即使檔案大小不變,系統的可用磁碟空間也將減少。

dd if=/dev/urandom2 bs=4096 seek=999 count=1
dd if=/dev/urandom of=testfile2 bs=4096 seek=999 count=1
ls -lh testfile*
du -h testfile*
結論:

1. 無空洞的檔案,檔案大小和占用磁碟的大小是一樣的。

2. 有空洞的檔案,檔案大小是4m,而占用塊大小是 4k。

空洞檔案1

ls l file 檢視檔案邏輯大小 du c file 檢視檔案實際占用的儲存塊多少 od c file 檢視檔案儲存的內容 空洞檔案是個啥玩意?就是有空洞的檔案,在日常的常識中,我們使用的檔案存放在硬碟分割槽上的時候,有多大的內容就會占用多大的空間,比如這個文字檔案裡面寫有1000個asc字元,...

Linux mmap記憶體對映,檔案空洞詳解

我們知道,cpu從 i o裝置 讀寫的速度非常慢,而從 記憶體 讀寫的速度非常快,如果對乙個檔案需要進行多次讀寫,那麼每一次都呼叫 i o 讀寫操作時很不划算的,於是我們便將這個檔案 對映 到記憶體中,這樣cpu就可以直接快速讀寫。mmap記憶體對映是一種空間換時間的思想。另外,mmap記憶體對映可...

檔案lseek操作產生空洞檔案的方法

在檔案操作過程中,lseek操作可以偏移到檔案的任意位置。在unix檔案操作中,檔案位移量可以大於檔案的當前長度,在這種情況下,對該檔案的下一次寫將延長該檔案,並在檔案中構成乙個空洞,這一點是允許的。位於檔案中但沒有寫過的位元組都被設為 0。如果 offset 比檔案的當前長度更大,下乙個寫操作就會...