入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

log文件超过2G导致程序崩

创建时间:2015-07-02 投稿人: 浏览次数:762

文件超过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;其余的搭配都是错误的!

声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。