Функция 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
.)