64位系统 32位程序 无法打开大于2G文件解决办法

前言

线上业务是32位的程序,服务器使用的Debian 64位,理论上ext4的文件系统单文件最大支持16T。由于程序日志没有按定时分类,以致于单个文件达到2G,由于无法写入结果导致部分时间段的日志丢失。 最后分析发现是32位程序引用了32位的库,单文件达到32G后fopen无法写入。

一、定义宏

  • 定义宏,使得可以处理大文件(>4GB) (凡是用到得地方,都要引入这个宏定义。所以需要单独写在一个.h文件里)
  #undef   _FILE_OFFSET_BITS   
  #define   _FILE_OFFSET_BITS   64   
  #include   <unistd.h>   
  #include   <dirent.h>

二、在makefile编译选项里加上-D_FILE_OFFSET_BITS=64 -D_LARGE_FILE

(Qt可以在pro文件里修改DEFINES += _FILE_OFFSET_BITS=64 _LARGE_FILE,自动会在makefile中生成如上格式的参数)

三、使用fopen64函数

四、在使用fopen等函数的加上一个参数:

  • 对与open,可以使用O_LARGEFILE参数,
  • 即: fd = open("./bill_test",O_LARGEFILE|O_APPEND|O_RDWR,0666);
    然后就没用问题了,但是fopen没有这个参数,只能按照方法一来解决。