标签归档:空洞文件

lseek与空洞文件

确定打开文件的当前偏移量

#include 
#include 
#include 

int main(int argc, char* argv[])
{
	off_t offset;
	if((offset = lseek(STDIN_FILENO, 0, SEEK_CUR)) == -1)
		printf("cannot seek\n");
	else
		printf("seek OK,offset = %lu\n",offset);

	return 0;
}

空洞文件:文件中的空洞并不要求在磁盘上占用储存区。当lseek定位超出文件尾端之后写时,对于新写的数据需要分配磁盘块,但是对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块。其在磁盘中的表现都为0

// 创建空洞文件
#include 
#include 
#include 
#include 
#include 

char buf1[] = "abcdefghij";
char buf2[] = "ABCDEFGHIJ";

int main(void)
{
	int fd;

	if((fd = creat("file.hole", S_IRWXU | S_IRWXG | S_IRWXG)) < 0)
	{
		printf("creat failed\n");
		return -1;
	}

	if(write( fd, buf1, 10) != 10)
	{
		printf("buf1 write error\n");
		return -1;
	}
	// offset now = 10
	
	if(lseek(fd, 16384, SEEK_SET) == -1)
	{
		printf("lseek failed\n");
		return -1;
	}
	// offset now = 16384
	
	if(write(fd, buf2, 10) != 10)
	{
		printf("buf2 write failed\n");
		return -1;
	}
	// offset now = 16394
	
	return 0;
}