如何在 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_t
、fsblkcnt_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.
(粗体字:我的重点)
这是我的代码:
#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_t
、fsblkcnt_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()
versuslseek()
, etc.). New programs should not employ this macro; instead_FILE_OFFSET_BITS=64
should be employed.
(粗体字:我的重点)