Chinaunix首页 | 论坛 | 博客
  • 博客访问: 117738
  • 博文数量: 54
  • 博客积分: 2986
  • 博客等级: 少校
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2009-12-18 10:26
文章分类

全部博文(54)

文章存档

2012年(2)

2011年(16)

2010年(36)

我的朋友

分类: C/C++

2010-06-24 22:10:25

1、包含所有头文件以前,先定义这些宏:
#ifndef __USE_FILE_OFFSET64
#define __USE_FILE_OFFSET64
#endif

#ifndef __USE_LARGEFILE64
#define __USE_LARGEFILE64
#endif

#ifndef _LARGEFILE64_SOURCE
#define _LARGEFILE64_SOURCE
#endif

2、使用open打开文件的时候,加上O_LARGEFILE标志:
int fd = open("test.dat", O_RDWR|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);
此外,还可以用fopen64,也要先加上上面3个宏定义。
具体的可以去看一下fcntl.h这个头文件

此外,文件系统单个文件的大小是有限制的。对于ext3,单个文件的大小是
1k 16G
2k 256G
4k 2T
更多文件系统的限制,可以查看
阅读(1173) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~