如何在 32 位程序中使用 statfs64()?

How to use statfs64() in a 32bit program?

这是我的代码:

#include <stdio.h>
#include <sys/statfs.h>

int main(int argc, char** argv)
{
    struct statfs64 mystatfs64;
    statfs64("/", &mystatfs64);  
    return 0;
}

但是我得到这个错误:

error: storage size of ‘mystatfs64’ isn’t known
warning: implicit declaration of function ‘statfs64’; did you mean ‘statfs’?

在手册页上它说:glibc statfs() 和 fstatfs() 包装函数透明地处理内核差异。

所以我将代码更改为:

#include <stdio.h>
#include <sys/statfs.h>

int main(int argc, char** argv)
{
    struct statfs mystatfs;
    statfs("/", &mystatfs);
    return 0;
}

现在可以编译了,但是 sizeof(((struct statfs*)0)->f_blocks) 是 4,所以我无法处理大文件系统。

我也尝试定义 __USE_LARGEFILE64 和 __USE_FILE_OFFSET64 但没有成功。

__USE_* 宏是供 glibc 内部 header features.h 定义的,不是你。如果您尝试自己定义它们,它们将不起作用。

您应该从 不同的 集合中定义宏,称为“功能测试宏”或“功能选择宏”,部分由 POSIX 指定。 glibc 理解的完整功能测试宏集的最 up-to-date 和连贯的文档在 Linux 联机帮助页中:feature_test_macros(7)。请注意,在您包含任何系统 headers.

之前,必须定义大多数这些宏

编写您尝试编写的代码的最佳方法是使用 _FILE_OFFSET_BITS 功能测试宏来使正常的 off_tfsblkcnt_t 等成为 64 位宽:

#define _FILE_OFFSET_BITS 64
#include <inttypes.h>
#include <stdio.h>
#include <sys/statfs.h>

int main(int argc, char** argv)
{
    struct statfs mystatfs;
    statfs("/", &mystatfs);
    printf("block count: %"PRIu64"\n", mystatfs.f_blocks);
    return 0;
}

如果您不想将此 #define 添加到您程序的每个 .c 文件的顶部,您可以将 -D_FILE_OFFSET_BITS=64 添加到您的编译选项在您的 Makefile 或等效文件中(例如,如果您使用 Make 的标准 built-in 编译规则,请将其添加到 CPPFLAGS)。

您还可以选择使用 _LARGEFILE64_SOURCE 来访问 xxx64 函数和类型,但 C 库维护者不鼓励这样做:请注意它在联机帮助页中的说明我在上面链接

_LARGEFILE64_SOURCE
Expose definitions for the alternative API specified by the LFS (Large File Summit) as a "transitional extension" to the Single UNIX Specification. (See ⟨https://www.opengroup.org/platform/lfs.html⟩.) The alternative API consists of a set of new objects (i.e., functions and types) whose names are suffixed with "64" (e.g., off64_t versus off_t, lseek64() versus lseek(), etc.). New programs should not employ this macro; instead _FILE_OFFSET_BITS=64 should be employed.

(粗体字:我的重点)