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

10-11 15:54