0

跟随这个问题: 如何在 C 中快速创建大文件?

我记得 4-5 年前,我能够fallocate在 Linux 中使用 shell 实用程序来创建没有孔/间隙的文件。

磁盘文件系统是 ext3、ext4 或 xfs。

当时,fallocateshell 实用程序在不到一秒的时间内创建了 8 GB 的文件。我不记得文件是否充满零或随机。

我现在尝试复制它,但它似乎创建了带有孔/间隙的文件。

我想知道这是如何用C语言完成的?

  • 一些仅适用于 Linux 的内核调用?
  • 一些内核调用在规范中有错误,后来被修复?
  • 一些不再可用的内核调用?
4

1 回答 1

1

Linux 上的fallocate系统调用可以选择将空间归零。

#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支持它。

否则,如果您正在寻找更便携的解决方案(当然效率不高),您可以自己写零。

于 2020-05-09T12:16:39.437 回答