0

我想用系统调用预分配存储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);

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

4

1 回答 1

2

如果你的目标是一个连续的空间,你应该用 flag 调用失败fcntlif 。F_ALLOCATECONTIGret == -1

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

ftruncatedarwin 需要调用才能正确报告文件大小。没有调用空间被保留,但报告的文件大小仍然为零。阅读这篇文章,其中指出:

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

于 2015-04-17T07:51:55.237 回答