写入文件而不填写Linux

Neb*_*mak 11 linux file embedded-linux lseek

假设我们的目的是在运行Linux的嵌入式设备上创建一个带有大洞的文件,我们将在稍后编写.我们打开文件,获取文件描述符并调用lseek它来寻找某个已知位置.之后,当我们想要在搜索到的位置写入该文件时,我们会调用write它.

但是,在第一次写入时,通过搜索创建的孔变为零填充,如果孔足够大,则此操作可能需要一些时间.在我的应用程序中,不需要这个零初始化,因为这个孔的长度非常精确,我稍后会用我的数据填充它.

有没有办法避免在填零write后进行第一次调用seek(即使它涉及修改文件系统驱动程序)?或者,有没有办法在文件开头之前写入文件(附加到文件的前面)?

the*_*aul 8

这可能与您的文件系统有关.在ext2/3/4,Reiser,它BTRFS,XFS等,做你的描述应该不会需要很长的时间,因为他们支持是所谓的"稀疏文件"(文件其占用较少的空间在底层存储比文件的大小,因为没有物理存储零的运行.

您可以尝试进行实验,dd以确保是这种情况:

$ dd if=/dev/zero of=whatever bs=1k seek=1073741824 count=1
1+0 records in
1+0 records out
1024 bytes (1.0 kB) copied, 9.1878e-05 s, 11.1 MB/s
$ ls -al whatever
-rw-r--r-- 1 xxxx xxxx 1099511628800 Jan 31 18:04 whatever
$ du -h whatever
16K whatever
Run Code Online (Sandbox Code Playgroud)

在您的文件系统上,这可能会失败.如果是这样,您需要创建一个稀疏文件,确定是否可以使用不同的文件系统.