Функция DD / Fallocate-Smili в Perl

У меня есть такая строчка dd if=/dev/zero of=myImg.img bs=1KB count=1024k, что я должен сделать несколько раз в моем сценарии. Поэтому я хотел интегрировать эту строку в моем скрипте Perl, а не делать system('...'); звоните, но создавая функционал. Есть ли хороший способ сделать это?

Я пробовал это с MakeMaker, но я не нашел правильного способа установить правильную длину / смещение моего файла, или что-то похожее на -o -l от fallocate, И конечно, очевидный способ open(FH,">/myFolder/MyImg.img"); тоже не работал.

2 ответа

Решение

fallocate(1) имеет преимущество, заключающееся в том, что он намного быстрее, чем чистый Perl способ записи гигабайта нулевых байтов. Он использует специфичный для Linux системный вызов, который имеет эквивалент POSIX, но, к сожалению, он не реализован POSIX модуль. Если вы можете использовать разреженные файлы (единственное приложение, о котором я могу подумать сейчас, и которое им действительно не нравится, это использовать файлы в качестве пространства подкачки), самый простой способ - это вызвать truncate($fh, $size), Но, конечно, вам сначала нужно открыть файл для записи - почему это не сработало?

Ваш вопрос сводится к следующему:

Как я могу создать 1000-мегабайтный файл NUL-байтов в Perl?

Вы можете использовать следующее:

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=1024k для обоих dd и для perl.)

Другие вопросы по тегам