gpt4 book ai didi

c - 你如何以编程方式在 Linux 上创建一个完全空的稀疏文件?

转载 作者:IT王子 更新时间:2023-10-29 00:24:37 41 4
gpt4 key购买 nike

如果你用这个运行 dd:

dd if=/dev/zero of=sparsefile bs=1 count=0 seek=1048576

您似乎获得了一个完全未分配的稀疏文件(这是 ext4)

smark@we:/sp$ ls -ls sparsefile 
0 -rw-rw-r-- 1 smark smark 1048576 Nov 24 16:19 sparsefile

fibmap 同意:

smark@we:/sp$ sudo hdparm --fibmap sparsefile 
sparsefile:
filesystem blocksize 4096, begins at LBA 2048; assuming 512 byte sectors.
byte_offset begin_LBA end_LBA sectors

无需深入挖掘 dd 的源代码,我正在尝试弄清楚如何在 C 中做到这一点。

我尝试了 fseeking 和 fwriting 零字节,但它什么也没做。不确定还能尝试什么,我想在我追查 dd 的内部结构之前可能有人知道。

编辑:包括我的例子...

FILE *f = fopen("/sp/sparse2", "wb");
fseek(f, 1048576, SEEK_CUR);
fwrite("x", 1, 0, f);
fclose(f);

最佳答案

当您使用 write 或最终调用 write 的各种库例程写入文件时,有一个与该文件关联的文件偏移指针描述符决定字节在文件中的位置。它通常位于最近一次调用 readwrite 所处理的数据的末尾。但是你可以使用 lseek将指针定位在文件内的任何位置,甚至超出文件的当前末尾。当您在超出当前 EOF 的点写入数据时,被跳过的区域在概念上用零填充。许多系统会进行优化,这样跳过的区域中的任何整个文件系统 block 都不会被分配,从而生成一个稀疏文件。尝试读取此类 block 将会成功,并返回零。

将充满零的 block 大小的区域写入文件通常不会生成稀疏文件,尽管某些文件系统可能会这样做。

GNU dd 使用的另一种生成稀疏文件的方法是调用 ftruncatedocumentation是这样说的:

The ftruncate() function causes the regular file referenced by fildes to have a size of length bytes.

If the file previously was larger than length, the extra data is discarded. If it was previously shorter than length, it is unspecified whether the file is changed or its size increased. If the file is extended, the extended area appears as if it were zero-filled.

对稀疏文件的支持是特定于文件系统的,尽管几乎所有为 UNIX 设计的本地文件系统都支持它们。

关于c - 你如何以编程方式在 Linux 上创建一个完全空的稀疏文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33904102/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com