Как быстро создавать большие файлы на C в Linux?
После этого вопроса: как быстро создавать большие файлы на C?
Помню, 4-5 лет назад я умел пользоваться fallocate
Утилита оболочки в Linux для создания файлов без дырок / пробелов.
Дисковая файловая система была ext3, ext4 или xfs.
В это время, fallocate
Утилита оболочки создала файлы размером 8 ГБ менее чем за секунду. Я не помню, был ли файл заполнен нулями или случайным образом.
Сейчас я пытаюсь воспроизвести это, но похоже, что получается файл с дырками / пробелами.
Мне интересно, как это было сделано в C
язык?
- Какой-то вызов ядра, это только Linux?
- Какой-то вызов ядра с ошибкой в спецификации, которая позже была исправлена?
- Какой-то вызов ядра, который больше не доступен?
1 ответ
В fallocate
системный вызов в Linux имеет возможность обнулить пространство.
#define _GNU_SOURCE
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int fd = open("testfile", O_RDWR | O_TRUNC | O_CREAT, 0755);
off_t size = 1024 * 1024 * 1024;
if (fd == -1) {
perror("open");
exit(1);
}
if (fallocate(fd, FALLOC_FL_ZERO_RANGE, 0, size) == -1) {
perror("fallocate");
exit(1);
}
}
Обратите внимание, что FALLOC_FL_ZERO_RANGE
могут поддерживаться не всеми файловыми системами. ext4
поддерживает это.
В противном случае вы можете сами написать нули, если ищете более портативное решение (что, конечно, не так эффективно).