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

标签 c macos filesystems darwin fcntl

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

相关文章:

c - Ruby C 扩展 API 问题

c - 在 C 程序中使用汇编语言的目的是什么?

macos - 如何运行 "gmake install"?

macos - 如何清除 Mac OS X 终端中以前的输出?

macos - Git 使文件名首字母大写

c - 如何使用该目录的文件描述符在内核级别打开该目录?

c - 如何存储每个进程变量,类似于 unix 如何存储每个进程的 pwd?

c - 如果我使用所有动态分配的内存,是否必须释放它?

c - 二维数组大小增加后变量发生变化

PHP 获取绝对路径而不遵循符号链接(symbolic link)