使用 fcntl 预分配存储无法按预期工作

Preallocate storage with fcntl doesn't work as expected

我想使用系统调用 fcntl 预分配存储空间。这是我的代码:

fstore_t store = {F_ALLOCATECONTIG, F_PEOFPOSMODE, 0, length, 0};
int ret = fcntl(fd, F_PREALLOCATE, &store);
if (ret == -1) {
    store.fst_flags = F_ALLOCATEALL;
    ret = fcntl(fd, F_PREALLOCATE, &store);
}

变量 ret 在执行该代码后不是 -1。当我通过在同一文件句柄上调用 fstat 获取文件大小时,我得到 stat.st_size = 0。但是值 store.fst_bytesalloc 等于 length.
的值 我需要做什么?当我打电话时

ftruncate(fd, length);

我得到的文件是有洞的还是 'real' 没有洞的文件?第二个是我的目标。

如果你的目标是一个连续的space 只有你应该用F_ALLOCATECONTIG标志调用fcntl并且如果ret == -1.

您代码中对 fcntl 的第二次调用(未设置 F_ALLOCATECONTIG 标志)将尝试预分配非连续 space(因为连续分配失败)。

ftruncate 需要在 darwin 上调用才能正确报告文件大小。没有调用 space 被保留,但报告的文件大小仍然为零。阅读这篇 article,其中指出:

It appears that the posix_fallocate equivalent [on OS X] is to the fnctl followed by a truncate() call (which actually forces data to be written to the file)