函数 lseek() 仅将当前的文件偏移量记录在内核中,并不引起任何 I/O 操作;该偏移量用于下一个读或写操作。偏移量可以大于文件当前长度,在这种情况下,对该文件的下一次写操作将加长该文件,并在文件中构成一个空洞;位于文件中但没有写过的字节都被读为 0,且空洞不占用磁盘空间。
下面是取自《UNIX环境高级编程》的示例代码,用于生成一个具有空洞的文件 “file.hole”。
#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"); if (write(fd, buf1, 10) != 10) err_sys("buf1 write error"); /* offset now = 10 */ if (lseek(fd, 16384, SEEK_SET) == -1) err_sys("lseek error"); /* offset now = 16384 */ if (write(fd, buf2, 10) != 10) err_sys("buf2 write error"); /* offset now = 16394 */ exit(0); }
使用 od -c file.hole
命令可以观察文件的实际内容。