空洞文件的作用

转载 http://luodw.cc/2015/12/27/emptyfile/ 罗道文的私房菜

空洞文件作用一
在共享内存的时候有用到.共享内存的机制是两个进程都调用mmap函数,然后将同一个文件fd映射到各自虚拟内存中,虽然这两个进程有各自的映射内存,但是这两个虚拟内存对应的是同一块物理内存,这才实现了共享内存.

当两个文件需要共享内存时,由于不知道需要共享内存的大小,所以需要在文件创建好之后来设置文件的大小.这时就需要用到空洞文件了.一开始文件的大小为0,如果要设置文件的大小为filesize,那么这时就可以调用lseek函数来设置

lseek(fd,filesize-1,SEEK_SET)
write(fd,”“,1);
先调用lseek定位到最后一个字符,然后写一个空字符,这时[0,filesize-2]范围内都是0,这就是一个空洞文件,文件大小为filesize.

空洞文件作用二
还有我们在用迅雷下载文件时,还未下载完成时,就已经占据了全部文件大小的空间,这也是空洞文件爱你.下载时如果没有空洞文件,多线程下载时文件就只能从一个地方写入,这就不能发挥多线程的作用了.如果有了空洞文件,可以从不同的地址写入,就完成了多线程的优势.

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

可以让文件尽可能的占用连续的磁盘扇区,减少后续写入和读取文件时的磁盘寻道开销;
迅速占用磁盘空间,防止使用过程中所需要空间不足;
后面追加数据的话,不会需要改变文件大小,所以后面将部设计metadata的修改.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以利用lseek函数的空洞文件原理来实现对文件的分片拷贝。空洞文件是指文件中存在一些数据块没有被实际占用,这些数据块被称为空洞。lseek函数可以用来改变文件的读写位置,并且当设置的位置超过文件的大小时,文件会被自动扩展,并在扩展的空间中填充0。 下面是一个使用lseek函数进行分片拷贝的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <fcntl.h> void copyFile(char* srcPath, char* destPath, off_t start, off_t size) { int srcFd = open(srcPath, O_RDONLY); int destFd = open(destPath, O_WRONLY | O_CREAT | O_TRUNC, 0644); if (srcFd == -1 || destFd == -1) { perror("Failed to open file"); exit(1); } off_t fileSize = lseek(srcFd, 0, SEEK_END); lseek(srcFd, start, SEEK_SET); char buffer[1024]; off_t remaining = size; while (remaining > 0) { ssize_t bytesRead = read(srcFd, buffer, sizeof(buffer)); if (bytesRead > remaining) { bytesRead = remaining; } ssize_t bytesWritten = write(destFd, buffer, bytesRead); if (bytesWritten != bytesRead) { perror("Failed to write file"); exit(1); } remaining -= bytesRead; } close(srcFd); close(destFd); } int main() { char* srcPath = "source_file.txt"; char* destPath = "destination_file.txt"; off_t start = 100; // 起始位置 off_t size = 200; // 拷贝的大小 copyFile(srcPath, destPath, start, size); return 0; } ``` 上述代码中,copyFile函数用于实现文件的分片拷贝。它首先打开源文件和目标文件,然后使用lseek函数将源文件的读写位置移动到指定的起始位置start。接下来,使用read函数从源文件中读取数据到缓冲区buffer中,然后使用write函数将缓冲区中的数据写入目标文件。这个过程会循环执行,直到拷贝指定大小的数据或者源文件的数据读取完毕。最后,关闭源文件和目标文件文件描述符。 你可以根据实际需求修改代码中的文件路径、起始位置和拷贝大小等参数。注意,这里的起始位置和拷贝大小都是以字节为单位的偏移量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值