这里用到了内核的 lseek 函数:
#include <unistd.h>
off_t lseek(int filedes, off_t offset, int whence);
文件的空洞并不要求在磁盘上占用存储区。当定位超出文件尾端之后写时,对于新写的数据需要分配磁盘块,但是对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块。 下面是测试程序:
#include <fcntl.h>
#include <unistd.h>
#define FILE_MODE (S_IRUSR || S_IWUSR || S_IRGRP || S_IROTH)
char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ";
int main()
{
int fd;
//创建文件
if ((fd = creat("file.hole", FILE_MODE)) < 0) {
printf("create error\n");
exit(1);
}
//写数据
if (write(fd, buf1, 10) != 10) {
printf("buf1 write error\n");
exit(1);
}
//设置偏移量
if (lseek(fd, 16384, SEEK_SET) == -1) {
printf("lseek error\n");
exit(1);
}
//写数据
if (write(fd, buf2, 10) != 10) {
printf("buf2 write error\n");
exit(1);
}
//创建文件并写入数据
fd = creat("file.nohole", FILE_MODE);
int i;
for(i=0; i<16390; i+=10)
write(fd, buf1, 10);
write(fd, buf1, 4);
exit(0);
}
运行之后的结果如下:
可以用 od -c 命令查看文件的实际内容:
虽然两个文件的长度相同,但无空洞的文件占用了20个磁盘块,而具有空洞的文件只占用8个磁盘块。