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

时间:2015-04-16 18:15:16

标签: c macos filesystems darwin fcntl

我想使用系统调用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);

我得到一个有洞的文件,还是没有洞的“真实”文件?第二个是我的目标。

1 个答案:

答案 0 :(得分:1)

如果您的目标是一个连续的空间 ,您应该使用fcntl标记来F_ALLOCATECONTIG,如果ret == -1则会失败。

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

darwin需要

ftruncate调用才能正确报告文件大小。如果没有保留调用空间,但报告的文件大小仍为零。阅读说明:

article
  

似乎posix_fallocate等效[在OS X上]是fnctl   然后是truncate()调用(实际上强制数据)   写入文件)