#include "apue.h" #include <fcntl.h> char buf1[]= "abcdefghij"; char buf2[]= "ABCDEFGHIJ"; int main(void) { int fd; if((fd = creat("file.hole",FILE_MODE)) <0) err_sys("creat error"); /* offset now 10 */ if(write(fd,buf1,10) !=10) err_sys("buf1 write error"); /* offset now 16384 */ if(lseek(fd,16384,SEEK_SET) == -1) err_sys("lseek error"); if(write(fd,buf2,10) != 10) err_sys("buf2 write error"); /* offset now 16394 */ exit(0); }
文件偏移量可以大于文件的当前长度,在这种情况下,对该文件的下一次写将加长该文件,并在文件中构成空洞,这一点是允许的。位于文件中但没有写过的字节都被读为0。
文件中的空洞并不要求在磁盘上占用存储区。具体处理方式与文件系统的实现有关,当定位到超出文件尾端之后写时,对于新写的数据需要分配磁盘块,但是对于原文件尾端和新开始写位置之间的部分则不需要分配磁盘块。