32位LINUX系统对文件大小有个限制,最大只能达到2^31 - 1字节,也就是2G,即使文件系统支持更大的4000G的文件.具体为啥有这个限制我也说不清.只是在做一个数据库的TPC-H测试时发现的.上网找了几个资料,汇总一下大文件的解决之道.
对于用C语言的API打开的文件,也就是用fopen(const char *filename, int mode)方式打开的文件,只需要在编译时加入一个参数,告诉系统在文件内部使用64位的偏移地址就行了:-D_USE_FILE_OFFSET_BITS=64,原有程序不需要做任何改动,保持程序的可移植性.
另外,也可以使用LINUX自己的库函数进行文件操作:open(const char *filename, int flags, int mode)或者open(const char *filename, int flags)打开文件.只是其中的flags参数需要多加一个O_LARGEFILE.如下所示:
int fp = open("myfile", O_WRONLY | O_TRUNC | O_CREAT | O_LARGEFILE, 644);
然而,对于O_LARGEFILE的引用却来的很不方便,在加入所有必需的头文件fcntl.h, sys/stat.h, sys/types.h等等后,还会被编译器提示O_LARGEFILE没有定义.这时,需要使用下面的方法使O_LARGEFILE变的有意义:
2 #include < fcntl.h >
3 // 其它头文件,等等
4
5 int fp = open( " myfile " , O_TRUNC | O_CREAT | O_RDWR | O_LARGEFILE, 644 );
6