使用 fcntl 预分配存储无法按预期工作
Preallocate storage with fcntl doesn't work as expected
我想使用系统调用 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);
我得到的文件是有洞的还是 'real' 没有洞的文件?第二个是我的目标。
如果你的目标是一个连续的space 只有你应该用F_ALLOCATECONTIG
标志调用fcntl
并且如果ret == -1
.
您代码中对 fcntl
的第二次调用(未设置 F_ALLOCATECONTIG
标志)将尝试预分配非连续 space(因为连续分配失败)。
ftruncate
需要在 darwin 上调用才能正确报告文件大小。没有调用 space 被保留,但报告的文件大小仍然为零。阅读这篇 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)
我想使用系统调用 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);
我得到的文件是有洞的还是 'real' 没有洞的文件?第二个是我的目标。
如果你的目标是一个连续的space 只有你应该用F_ALLOCATECONTIG
标志调用fcntl
并且如果ret == -1
.
您代码中对 fcntl
的第二次调用(未设置 F_ALLOCATECONTIG
标志)将尝试预分配非连续 space(因为连续分配失败)。
ftruncate
需要在 darwin 上调用才能正确报告文件大小。没有调用 space 被保留,但报告的文件大小仍然为零。阅读这篇 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)