文件超过2G导致的问题:
使用open打开文件的时候,加上O_LARGEFILE标志:
int fd = open("test.dat", O_RDWR|O_APPEND|O_CREAT|O_LARGEFILE, 0666);read(), write()等与一般的用法一致,无变化。
3、注意lseek()函数,文件未超过2G的时候,一切工作良好;
文件超过2G后,调用返回-1,errno为EOVERFLOW (errno=75, msg=Value too large for defined data type)
需要使用lseek64()代替lseek()。很奇怪,定义了宏以后,并未自动将lseek变成lseek64。(知道原因的朋友可以教教我)
4、注意stat()函数,传入的文件如果在2G内,工作良好;
传入的文件如果超过2G,返回-1, errno为EOVERFLOW (errno=75, msg=Value too large for defined data type)
应该这样使用:struct stat64 st; stat64("file", &st);
未定义_FILE_OFFSET_BITS的情况下,ftruncate64调用是非法的,会产生无法预料的后果,这里的测试就是产生一个超大文件(>1T),我也无法解释其原因;O_LARGEFILE的作用就是在32位系统中支持大文件系统,允许打开那些用31位(2G)都不能表示其长度的大文件;此外,off_t为 unsigned int类型,也就是说最多只能达到4G,所以ftruncate最大支持4G文件。
总结一下:
如果要支持超过2G的文件,至少需要定义 _LARGEFILE64_SOURCE宏,并且设置O_LARGEFILE选项;如果要支持超过4G,需要定义所有上述的宏,并且调用 ftruncate64;其余的搭配都是错误的!