dd/fallocate-smiliar perl 函数

dd/fallocate-smiliar function in perl

我有一行 dd if=/dev/zero of=myImg.img bs=1KB count=1024k ,我必须在我的脚本中多次这样做。因此我想将这一行集成到我的 perl 脚本中,不是通过调用 system('...');,而是通过创建函数。有这样做的好方法吗?

我已经用 MakeMaker 试过了,但我没有找到正确的方法来设置我的 filelength/offset 或任何类似于 -o -l 的方法 fallocate。 当然,显而易见的方法 open(FH,">/myFolder/MyImg.img"); 也行不通。

您的问题如下:

How can I create a 1,000 MiB file of NUL bytes in Perl?

您可以使用以下内容:

open(my $fh, '>', $qfn)
   or die("Can't create \"$qfn\": $!\n");

for (1..1000) {
   print($fh "[=10=]" x (1024*1024))
      or die("Error writing to \"$qfn\": $!\n");
}

close($fh)
   or die("Error writing to \"$qfn\": $!\n");

(好吧,这实际上等同于 bs=1024k count=1KB,但结果是相同的,而且对于 ddperl,它都比 bs=1KB count=1024k 快。 )

fallocate(1) 的优点是比写出 1 GB 零字节的纯 Perl 方法快得多。它使用了一个 Linux-specific 系统调用,它确实有一个 POSIX 等价物,但不幸的是,POSIX 模块没有实现它。 如果你可以使用稀疏文件(我现在能想到的唯一一个真正不喜欢它们的应用程序是使用文件作为交换 space),最简单的方法是调用 truncate($fh, $size)。但是当然你确实需要先打开文件进行写入——为什么这不起作用?