我想使用系统调用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);
我得到一个有洞的文件,还是没有洞的“真实”文件?第二个是我的目标。
答案 0 :(得分:1)
如果您的目标是一个连续的空间 ,您应该使用fcntl
标记来F_ALLOCATECONTIG
,如果ret == -1
则会失败。
代码中第二次调用fcntl
(未设置F_ALLOCATECONTIG
标志)将尝试预先分配非连续空间(因为连续分配失败)。
ftruncate
调用才能正确报告文件大小。如果没有保留调用空间,但报告的文件大小仍为零。阅读说明:
似乎posix_fallocate等效[在OS X上]是fnctl 然后是truncate()调用(实际上强制数据) 写入文件)