我想使用系统调用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);
我会得到一个带孔的文件,还是一个没有孔的“真实”文件?第二个是我的目标。
最佳答案
如果您的目标是连续的空间,则仅应使用fcntl
标志调用F_ALLOCATECONTIG
,如果ret == -1
则失败。
在代码中第二次调用fcntl
(未设置F_ALLOCATECONTIG
标志)将尝试预分配非连续空间(因为连续分配失败)。
在darwin上需要ftruncate
调用才能正确报告文件大小。没有保留呼叫空间,但报告的文件大小仍为零。阅读此article指出:
似乎[在OS X上] posix_fallocate等效于fnctl
然后是truncate()调用(实际上是强制将数据
写入文件)
关于c - 使用fcntl进行预分配存储无法正常工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29682880/