XXX
分类: LINUX
2013-03-21 11:16:58
所以,默认情况下,在Linux系统下,fopen和open操作的文件大小不能超过2G。
我们制造了一个异常文件,5G左右,可以使用dd命令来构建,也可以写个脚本来构建。
我写了一段程序来测试:
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc,char *argv[])
{
FILE *fp;
int fd;
fp = fopen("./bill_test","a+"); //bill_test是一个5G左右的文件
if(fp == NULL)
{
perror("fopen bill_test fail::");
}
else
{
int ret = 0;
ret = fprintf(fp,"%s\t","bill");
if(ret < 0)
{
perror("write bill_test fail::");
fclose(fp);
exit(1);
}
fclose(fp);
}
fd = open("./bill_test",O_APPEND|O_RDWR,0666); //bill_test是一个5G左右的文件
if(fd == -1)
{
perror("open bill_test fail::");
}
else
{
int len=0;
len = write(fd,"hello",5);
if(len == -1)
{
perror("write bill_test fail::");
close(fd);
exit(1);
}
close(fd);
}
return 0;
}
//当使用: g++ file_test.cpp -o file_test 对源码编译后,运行结果如下:
./file_test
fopen bill_test fail::: File too large
open bill_test fail::: File too large
可以看出,在32位机器下,不能直接支持超过2G的文件。
解决方案一、
g++ -D _FILE_OFFSET_BITS=64 file_test.cpp -o file_test
此时在用tail -f bill_test,然后再运行./file_test,可以看到数据被正常的写入bill_test文件中。
解决方案二、
对与open,可以使用O_LARGEFILE参数,即:
fd = open("./bill_test",O_LARGEFILE|O_APPEND|O_RDWR,0666);
然后就没用问题了,但是fopen没有这个参数,只能按照方法一来解决。