gpt4 book ai didi

c - 使用 fcntl 预分配存储无法按预期工作

转载 作者:行者123 更新时间:2023-11-30 15:21:09 24 4
gpt4 key购买 nike

我想通过系统调用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 标志)将尝试预分配非连续空间(因为连续分配失败)。

darwin 上需要调用

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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com