linux系統編程之檔案與IO(三):利用lseek()建立空洞檔案

來源:互聯網
上載者:User

一、lseek()系統調用

功能說明:

通過指定相對於開始位置、當前位置或末尾位置的位元組數來重定位 curp,這取決於 lseek() 函數中指定的位置

函數原型:

#include <sys/types.h>
#include <unistd.h>

off_t lseek(int fd, off_t offset, int whence);

參數說明:

fd:檔案描述符

offset:位移量,該值可正可負,負值為向前移

whence:搜尋的起始位置,有三個選項:

(1).SEEK_SET: 當前位置為檔案的開頭,新位置為位移量大小
(2).SEEK_CUR: 當前位置為檔案指標位置,新位置為當前位置加上位移量大小
(3).SEEK_END: 當前位置為檔案結尾,新位置為位移量大小

傳回值:檔案新的位移值

二、利用lseek()產生空洞檔案(hole)

說明:

The lseek() function allows the file offset to be set beyond the end of the file (but this does not change the size of the file).  If  data  is later written at this point, subsequent  reads of the data in the gap (a "hole") return null bytes ('\0') until data is  actually  written  into the gap.

程式碼:

#include <stdio.h><unistd.h><fcntl.h><stdlib.h> ERR_EXIT(m) \    ( main(= open(,O_WRONLY|O_CREAT|O_TRUNC,(fd == -,= lseek(fd,*(ret == -, 

測試結果:

程式建立一個hole檔案,然後寫入”hello”字元,在利用lseek系統調用從當前位置位移到1024*1024*1024之後再寫入”world”字元,ls顯示檔案大小為1.1G,實際上它並沒有佔用這麼多的磁碟空間,du表明hole檔案只有8k,系統只是儲存一些資訊,用它來表示有多少個\0,當我們用cat查看檔案內容時只看到hello,由於檔案太大最後的world太后以致看不到,但當我們用od命令查看時,可以發現有好多個\0。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.