空洞文件的创建和说明

函数 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 命令可以观察文件的实际内容。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.