在linux下,用fwrite等C API函数来写文件时,会有一个文件大小的限制,一般是2G。问题是在做mysql数据库备份时发现
的。在网上搜了一下,确实有人碰到跟我一样的问题。解决的方案写的并不是很详细。不过有人贴出一个fseeko的文档说明出来,
里面有很重要的信息就是,其中fseeko函数中的off_t在大部分平台上默认为4字节大小。但是可以通过#define _FILE_OFFSET_BITS
64来把off_t这个转化为64比特类型的大小。其实也可以在linux下man fseeko来查看。
虽然有这个信息,但是并不知道怎么用,第一反应在我的“头文件”中加入#define _FILE_OFFSET_BITS 64,重新编译一次
,实验无效。突然想到mysqldump这个命令是可以写一个超过2G大小的文件,查看了一下mysqldump的源代码。发现其实应该是在编
译时加入编译选项-D_FILE_OFFSET_BITS=64就可以解决此问题。
实例:
// example.c
#include <stdio.h>
int main(int argc, char* argv[])
{
FILE *fp;
if ((fp = fopen("test.dat", "w+")) == NULL)
return;
int a = 0;
char data[1024] = "";
while (true)
{
fwrite(data, sizeof(data), 1, fp);
a++;
if (a >= 1024*2049)
break;
}
fclose(fp);
}
编译:gcc -g -o example -D_FILE_OFFSET_BITS=64 example.c
问题解决!!!