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





