Как быстро создать большие файлы размером C в Linux? - PullRequest
0 голосов
/ 09 мая 2020

После этого вопроса: Как быстро создавать большие файлы в C?

Я помню 4-5 лет go, я смог использовать fallocate shell в Linux для создания файлов без дырок / пробелов.

Дисковая файловая система была ext3, ext4 или xfs.

В то время утилита оболочки fallocate создавала файлы размером 8 ГБ в меньше одной секунды. Я не помню, был ли файл заполнен нулями или был случайным.

Я пытаюсь воспроизвести это в настоящее время, но похоже, что создается файл с дырками / пробелами.

Мне интересно, как это было сделано на C языке?

  • Некоторый вызов ядра, который имеет только Linux?
  • Некоторый вызов ядра с ошибкой в ​​спецификации, которая была позже исправлена?
  • Некоторый вызов ядра, которого больше нет есть в наличии?

1 Ответ

1 голос
/ 09 мая 2020

Системный вызов 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 поддерживает его.

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

...