Linux下读写超过2GB大文件

作者

QQ群:852283276
微信:arm80x86
微信公众号:青儿创客基地
B站:主页 https://space.bilibili.com/208826118

参考

What is the difference between _LARGEFILE_SOURCE and _FILE_OFFSET_BITS=64?
gcc -D_FILE_OFFSET_BITS=64
32位Linux下使用2G以上大文件的几个相关宏的关系
linux 32位平台,文件大小受限于2G的解决方法
32位linux系统操作大于2G文件方法
seek超过2G文件的方法

原理

lseek定义,

//E:\Xilinx\SDK\2015.2\gnu\arm\nt\arm-xilinx-linux-gnueabi\libc\usr\include\unistd.h
#ifndef __USE_FILE_OFFSET64
extern __off_t lseek (int __fd, __off_t __offset, int __whence) __THROW;
#else
# ifdef __REDIRECT_NTH
extern __off64_t __REDIRECT_NTH (lseek,
				 (int __fd, __off64_t __offset, int __whence),
				 lseek64);
# else
#  define lseek lseek64
# endif
#endif
#ifdef __USE_LARGEFILE64
extern __off64_t lseek64 (int __fd, __off64_t __offset, int __whence)
     __THROW;
#endif

__USE_FILE_OFFSET64定义了之后使用lseek可以读写超过大于2GB文件,__USE_FILE_OFFSET64要求_FILE_OFFSET_BITS == 64,或者直接使用lseek64,要求定义__USE_LARGEFILE64,来自于_LARGEFILE64_SOURCE

//E:\Xilinx\SDK\2015.2\gnu\arm\nt\arm-xilinx-linux-gnueabi\libc\usr\include\features.h
#ifdef _LARGEFILE_SOURCE
# define __USE_LARGEFILE	1
#endif

#ifdef _LARGEFILE64_SOURCE
# define __USE_LARGEFILE64	1
#endif

#if defined _FILE_OFFSET_BITS && _FILE_OFFSET_BITS == 64
# define __USE_FILE_OFFSET64	1
#endif

#if defined _DEFAULT_SOURCE
# define __USE_MISC	1
#endif

#ifdef	_ATFILE_SOURCE
# define __USE_ATFILE	1
#endif

#ifdef	_GNU_SOURCE
# define __USE_GNU	1
#endif

#if defined _REENTRANT || defined _THREAD_SAFE
# define __USE_REENTRANT	1
#endif

定义_GNU_SOURCE会打开_LARGEFILE64_SOURCE

//E:\Xilinx\SDK\2015.2\gnu\arm\nt\arm-xilinx-linux-gnueabi\libc\usr\include\features.h
/* If _GNU_SOURCE was defined by the user, turn on all the other features.  */
#ifdef _GNU_SOURCE
# undef  _ISOC95_SOURCE
# define _ISOC95_SOURCE	1
# undef  _ISOC99_SOURCE
# define _ISOC99_SOURCE	1
# undef  _ISOC11_SOURCE
# define _ISOC11_SOURCE	1
# undef  _POSIX_SOURCE
# define _POSIX_SOURCE	1
# undef  _POSIX_C_SOURCE
# define _POSIX_C_SOURCE	200809L
# undef  _XOPEN_SOURCE
# define _XOPEN_SOURCE	700
# undef  _XOPEN_SOURCE_EXTENDED
# define _XOPEN_SOURCE_EXTENDED	1
# undef	 _LARGEFILE64_SOURCE
# define _LARGEFILE64_SOURCE	1
# undef  _DEFAULT_SOURCE
# define _DEFAULT_SOURCE	1
# undef  _ATFILE_SOURCE
# define _ATFILE_SOURCE	1
#endif

方法1

在所有头文件之前添加,

#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64

或者更改编译选项,

gcc -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64

方法2

定义_GNU_SOURCE,open的时候加上O_LARGEFILE参数,并且用lseek64代替lseek

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值