Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1086111
  • 博文数量: 646
  • 博客积分: 288
  • 博客等级: 二等列兵
  • 技术积分: 5375
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-08 14:33
个人简介

为了技术,我不会停下学习的脚步,我相信我还能走二十年。

文章分类

全部博文(646)

文章存档

2014年(8)

2013年(134)

2012年(504)

分类: LINUX

2013-02-25 10:04:23

  在32位机器下,默认情况下,文件长度是off_t类型,这个可以从ftrucate的参数,从stat获取的文件属性struct stat中都可以看出文件的长度是用off_t类型表示的,即文件的长度在32位机器下默认是long int类型。

       所以,默认情况下,在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没有这个参数,只能按照方法一来解决。

阅读(679) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~