0

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

我已经用MakeMaker试过了,但我没有找到正确的方法来设置我的文件长度/偏移量,或者任何类似于-o -lfrom的东西fallocate。当然,显而易见的方法open(FH,">/myFolder/MyImg.img");也不起作用。

4

2 回答 2

2

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

于 2015-10-19T08:02:05.163 回答
1

您的问题相当于以下内容:

如何在 Perl 中创建一个 1,000 MiB 的 NUL 字节文件?

您可以使用以下内容:

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

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

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

(好吧,这真的等同于bs=1024k count=1KB,但结果是一样的,而且比bs=1KB count=1024kfordd和 for都快perl。)

于 2015-10-19T06:52:43.210 回答