在Linux c程序中创建一个2G的文件,循环写1KB的数据,共2*1024*1024次,最后一次写失败,
n=write(fd,buf,1024),n总是等于1023<1024,文件大小显示为2147483647B;
然后我又测试了往一个1G的文件中再追加1G的数据,循环写1KB的数据,共1024*1024次,也是最后一次写失败,问题同上。
write error ,write size is 1023(到2GB的最后一次写文件时,写不了1024个字节,只能写1023个字节)
后来百度了下,可能是Linux文件系统对文件大小的限制,尤其是看到了“Linux下2G文件限制解决方案”的东西后,我也不管三七二十一,就下载netkit-ftp-0.18-pre1.tar.gz,解压缩后,修改ftp/ftp.c,ftp/main.c 加入
#define _LARGEFILE_SOURCE //for LFS support
#define _FILE_OFFSET_BITS 64 //for LFS support
然后./configure && make 下,用ftp/ftp文件覆盖系统自带的ftp客户端,结果发现根本和我遇到的问题无关。
再检查我的文件系统是ext3,文件大小上限可达16G,按理可以成功创建2G的文件的。后来终于看到网上某个人发了“在LINUX平台下我有一个大于4G的文件, 怎么读这些文件的内容, ”的帖子,点进去看,才明白Linux下有如何处理大文件的方式。linux支持大文件的两种方式:
1、gcc 加 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE
2、
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
建议两种方式都加上。
gcc creat_file.c -o creat_file然后./creat_file data1得到:
---------- 1 root root 2147483647 2012-02-09 16:17 data1(错误的)
在编译时加上gcc -D_FILE_OFFSET_BITS=64-D_LARG_FILE creat_file.c -o creat_file然后./creat_file data1得到::
---------- 1 root root 2147483648 2012-02-09 16:19 data1 (正确的)
同理,往1G的文件中添加1G的数据也正确运行:
---------- 1 root root 1073741824 2012-02-09 16:57 data2(1G的文件,追加前)
gcc -D_FILE_OFFSET_BITS=64 -D_LARG_FILE rdwrfile.c -o rdwrfile然后./rdwrfile data2(执行追加的程序后)得到:
---------- 1 root root 2147483648 2012-02-09 16:59 data2(2G的文件,追加后)
在我的程序中只加了第一种方式,就可正确运行,得到正确的结果。只用第二种方式,不能解决问题。两种方式都加上,可以得到正确结果。