linux系统中用lseek()生成的空洞文件有什么用?

linux系统中用lseek()生成的空洞文件有什么用?,第1张

空洞文件很有用的,看看迅雷下载的文件,在未下载完成时就已经占据了全部文件大小桐槐的空间,这时候就是空洞文件。下载时如果没有空洞文件,多线程下载时文件就都只能从一个地方写入,这就不是多线程了。如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势任务。

在开发过程中有时候需要为某个文件快速地分配固定大小的磁盘空间

(1)可以让文件尽可能的占用连续的磁盘扇区,减少后续写入和读取文件消卖时的磁盘寻道开销;

(2)迅速占用磁局桥友盘空间,防止使用过程中所需空间不足。

(3)后面再追加数据的话,不会需要改变文件大小,所以后面将不涉及metadata的修改。

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

能:

移动文件读/写指针

法:

long

lseek(int

handle,

long

offset,

int

fromwhere)

所有打开的文件都有一个当前文件偏移量(current

file

offset),以下简称为

cfo。cfo

通常是一个非负整数,用于表滑好迟明文件开始处到文件当前位置的字节数。读写 *** 作通常开始于

cfo,并且使

cfo

增大,增量为读写的字节数。文件被打开时,cfo

会被初始化为

0,除非使用了

O_APPEND

使用

lseek

函数可以改变文件的

cfo

lseek

的以下用法返回当前的偏移量:

off_t

currpos

currpos

=

lseek(fd,

0,

SEEK_CUR)

这个技巧也可用于判断我们是否可以改变某个文件的偏移量。如果参数

fd(文件描述符)指定的是

pipe(管道)、FIFO

或者

socket,lseek

返回

-1

并且置

errno

ESPIPE。袜枯

对于普通文件(regular

file),cfo

是一个非负整数。但对于特殊设备,cfo

有可能是负数。因此,我们不能简单地测试

lseek

的返回值是否小于

0

来判断

lseek

成功与否,而应该测试

lseek

的返回值是否等于

-1

来判断

lseek

成功与否。

lseek

仅将

cfo

保存于内核中,不会导致任何

I/O

*** 作。这个

cfo

将被用于之后的读写 *** 作。

如果

offset

比文件的当前长度更大,下一个写 *** 作就会把文件“撑大(extend)”。这就是所谓的在文件里创造“空洞(hole)”。没有被实际写入文件的所有字节由重复的

0

表示。空洞是否占用硬盘空间是由文件系统(file

system)决定的。

编辑本段

程序例

#include

#include

#include

#include

#include

#include

int

main(void)

{

int

handle

char

msg[]

=

"This

is

a

test"

char

ch

/*

create

a

file

*/

handle

=

open("TEST.$$$",

O_CREAT

|

O_RDWR,

S_IREAD

|

S_IWRITE)

/*

write

some

data

to

the

file

*/

write(handle,

msg,

strlen(msg))

/*

seek

to

the

begining

of

the

file

*/

lseek(handle,

0L,

SEEK_SET)

/*

reads

chars

from

the

file

until

we

hit

EOF

*/

do

{

read(handle,

&ch,

1)

printf("%c",

ch)

}

while

(!eof(handle))

close(handle)

return

0

}

追问:

如果

offset

比文件的当前长度更大,下一个写 *** 作就会把文件“撑大(extend)”。这就是所谓的在文件里创信李造“空洞(hole)”。没有被实际写入文件的所有字节由重复的

0

表示。空洞是否占用硬盘空间是由文件系统(file

system)决定的。

还是没有回答返回值啊

追答:

返回值为0

空洞都被0填充

你可以这么做,空洞不是自己造成的吗迹汪,你可以计算出空洞的位置,稿正然后同样lseek将文件描叙符移到空洞后,前提是你知道空洞在什么位置,不知道也行,判断'\0'的个姿敬仔数,连续出现则说明到了空洞的位置,然后将文件描叙符置于此,读出文件大小


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12164871.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存