Linux Advance--文件IO--创建一个具有空洞的文件

这里用到了内核的 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个磁盘块。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值