perl中的dd / fallocate-miciliar函数

时间:2015-10-19 06:39:02

标签: perl file dd fallocate

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

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

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

您的问题等于以下内容:

  

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

您可以使用以下内容:

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=1024kddperl的速度都快于{{1}} {{1}}。)