stu*_*stu 7 c linux sparse-file
如果你用这个运行dd:
dd if=/dev/zero of=sparsefile bs=1 count=0 seek=1048576
Run Code Online (Sandbox Code Playgroud)
您似乎获得了一个完全未分配的稀疏文件(这是ext4)
smark@we:/sp$ ls -ls sparsefile
0 -rw-rw-r-- 1 smark smark 1048576 Nov 24 16:19 sparsefile
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
无需深入了解dd的来源,我正试图弄清楚如何在C中做到这一点.
我试过fseeking和写零字节,但它没有做任何事情.不知道还有什么可以尝试,我想在我追捕dd的内脏之前有人可能知道.
编辑:包括我的例子......
FILE *f = fopen("/sp/sparse2", "wb");
fseek(f, 1048576, SEEK_CUR);
fwrite("x", 1, 0, f);
fclose(f);
Run Code Online (Sandbox Code Playgroud)
当您使用write最终调用的各种库例程写入文件时write,会有一个与文件描述符关联的文件偏移指针,用于确定文件在文件中的位置.它通常位于最近一次调用read或处理的数据的末尾write.但您可以使用lseek将指针放在文件中的任何位置,甚至超出文件的当前末尾.当您在超出当前EOF的位置写入数据时,跳过的区域在概念上用零填充.许多系统会对事物进行优化,以便不会分配该跳过区域中的任何整个文件系统块,从而产生稀疏文件.尝试读取这些块将成功,返回零.
将块大小的区域写入文件通常不会产生稀疏文件,尽管某些文件系统可能会这样做.
生成GNU dd使用的稀疏文件的另一种方法是调用ftruncate.该文件说,这:
ftruncate()函数使fildes引用的常规文件具有length个字节的大小.
如果先前的文件大于长度,则丢弃额外的数据.如果它先前短于长度,则未指定文件是否已更改或其大小是否增加.如果文件已扩展,则扩展区域显示为零填充.
对稀疏文件的支持是特定于文件系统的,尽管几乎所有针对UNIX的本地文件系统都支持它们.
这是@MarkPlotnick的答案的补充,它是您使用所请求的功能的示例简单实现ftruncate():
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>
int
main(void)
{
int file;
int mode;
mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH;
file = open("sparsefile", O_WRONLY | O_CREAT, mode);
if (file == -1)
return -1;
ftruncate(file, 0x100000);
close(file);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2287 次 |
| 最近记录: |