我想通过系统调用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);
我得到的是有孔的文件还是没有孔的“真实”文件?第二个是我的目标。
最佳答案
如果您的目标仅是一个连续的空间,您应该使用 F_ALLOCATECONTIG
标志调用 fcntl
,如果 ret == - 则失败1
.
代码中对 fcntl
的第二次调用(没有设置 F_ALLOCATECONTIG
标志)将尝试预分配非连续空间(因为连续分配失败)。
ftruncate
才能正确报告文件大小。没有保留调用空间,但报告的文件大小仍然为零。阅读此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)
关于c - 使用 fcntl 预分配存储无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29682880/