Как быстро создавать большие файлы на 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 поддерживает это.

В противном случае вы можете сами написать нули, если ищете более портативное решение (что, конечно, не так эффективно).

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