作者
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