文件lseek操作產(chǎn)生空洞文件的方法
serif;text-align: start;white-space: normal;text-size-adjust: auto;background-color: rgb(255, 255, 255);">在文件操作過程中,lseek操作可以偏移到文件的任意位置。
在UNIX文件操作中,文件位移量可以大于文件的當(dāng)前長度,在這種情況下,對該文件的下一次寫將延長該文件,并在文件中構(gòu)成一個空洞,這一點是允許的。位于文件中但沒有寫過的字節(jié)都被設(shè)為 0。
如果 offset 比文件的當(dāng)前長度更大,下一個寫操作就會把文件撐大(extend)
。這就是所謂的在文件里創(chuàng)造空洞(hole)
。沒有被實際寫入文件的所有字節(jié)由重復(fù)的 0 表示??斩词欠裾加糜脖P空間是由文件系統(tǒng)(file system)
決定的。
空洞文件作用很大,例如迅雷下載文件,在未下載完成時就已經(jīng)占據(jù)了全部文件大小的空間,這時候就是空洞文件。下載時如果沒有空洞文件,多線程下載時文件就都只能從一個地方寫入,這就不是多線程了。如果有了空洞文件,可以從不同的地址寫入,就完成了多線程的優(yōu)勢任務(wù)。
接下來我們來實現(xiàn)一個案例,即創(chuàng)建一個1GB大小的空洞文件:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdio.h>
int main(void)
{
int fd;
off_t offset;
//創(chuàng)建一個權(quán)限為可讀可寫可執(zhí)行的文件"tmp"
fd = creat("tmp", 0777);
if(-1 == fd) //如果出錯返回-1
{
perror("creat");
return -1;
}
//設(shè)置偏移的大小為1024ll*1024ll*1024ll,并偏移到文件尾部
offset = lseek(fd, 1024ll * 1024ll * 1024ll, SEEK_END);
printf("offset = %d\n", offset);
//寫空,寫1個字節(jié)到文件描述符里
write(fd, "", 1);
//關(guān)閉文件描述符
close(fd);
return 0;
}
運行結(jié)果:
若覺得本次分享的文章對您有幫助,隨手點[在看]
并轉(zhuǎn)發(fā)分享,也是對我的支持。
section>
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!