LINUX下写大文件 -D _FILE_OFFSET_BITS=64或者open时加O_LARGEFILE
2017-03-15 11:47
567 查看
http://blog.163.com/xychenbaihu@yeah/blog/static/132229655201141211197621/
在32位机器下,默认情况下,文件长度是off_t类型,这个可以从ftrucate的参数,从stat获取的文件属性struct stat中都可以看出文件的长度是用off_t类型表示的,即文件的长度在32位机器下默认是long int类型。
所以,默认情况下,在Linux系统下,fopen和open操作的文件大小不能超过2G。
我们制造了一个异常文件,5G左右,可以使用dd命令来构建,也可以写个脚本来构建。
我写了一段程序来测试:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
FILE *fp;
int fd;
fp = fopen("./bill_test","a+"); //bill_test是一个5G左右的文件
if(fp == NULL)
{
perror("fopen bill_test fail::");
}
else
{
int ret = 0;
ret = fprintf(fp,"%s\t","bill");
if(ret < 0)
{
perror("write bill_test fail::");
fclose(fp);
exit(1);
}
fclose(fp);
}
fd = open("./bill_test",O_APPEND|O_RDWR,0666); //bill_test是一个5G左右的文件
if(fd == -1)
{
perror("open bill_test fail::");
}
else
{
int len=0;
len = write(fd,"hello",5);
if(len == -1)
{
perror("write bill_test fail::");
close(fd);
exit(1);
}
close(fd);
}
return 0;
}
//当使用: g++ file_test.cpp -o file_test 对源码编译后,运行结果如下:
./file_test
fopen bill_test fail::: File too large
open bill_test fail::: File too large
可以看出,在32位机器下,不能直接支持超过2G的文件。
解决方案一、
g++ -D _FILE_OFFSET_BITS=64 file_test.cpp -o file_test
此时在用tail -f bill_test,然后再运行./file_test,可以看到数据被正常的写入bill_test文件中。
解决方案二、
对与open,可以使用O_LARGEFILE参数,即:
fd = open("./bill_test",O_LARGEFILE|O_APPEND|O_RDWR,0666);
然后就没用问题了,但是fopen没有这个参数,只能按照方法一来解决。
在32位机器下,默认情况下,文件长度是off_t类型,这个可以从ftrucate的参数,从stat获取的文件属性struct stat中都可以看出文件的长度是用off_t类型表示的,即文件的长度在32位机器下默认是long int类型。
所以,默认情况下,在Linux系统下,fopen和open操作的文件大小不能超过2G。
我们制造了一个异常文件,5G左右,可以使用dd命令来构建,也可以写个脚本来构建。
我写了一段程序来测试:
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <unistd.h>
int main(int argc,char *argv[])
{
FILE *fp;
int fd;
fp = fopen("./bill_test","a+"); //bill_test是一个5G左右的文件
if(fp == NULL)
{
perror("fopen bill_test fail::");
}
else
{
int ret = 0;
ret = fprintf(fp,"%s\t","bill");
if(ret < 0)
{
perror("write bill_test fail::");
fclose(fp);
exit(1);
}
fclose(fp);
}
fd = open("./bill_test",O_APPEND|O_RDWR,0666); //bill_test是一个5G左右的文件
if(fd == -1)
{
perror("open bill_test fail::");
}
else
{
int len=0;
len = write(fd,"hello",5);
if(len == -1)
{
perror("write bill_test fail::");
close(fd);
exit(1);
}
close(fd);
}
return 0;
}
//当使用: g++ file_test.cpp -o file_test 对源码编译后,运行结果如下:
./file_test
fopen bill_test fail::: File too large
open bill_test fail::: File too large
可以看出,在32位机器下,不能直接支持超过2G的文件。
解决方案一、
g++ -D _FILE_OFFSET_BITS=64 file_test.cpp -o file_test
此时在用tail -f bill_test,然后再运行./file_test,可以看到数据被正常的写入bill_test文件中。
解决方案二、
对与open,可以使用O_LARGEFILE参数,即:
fd = open("./bill_test",O_LARGEFILE|O_APPEND|O_RDWR,0666);
然后就没用问题了,但是fopen没有这个参数,只能按照方法一来解决。
相关文章推荐
- LINUX下写大文件 -D _FILE_OFFSET_BITS=64或者open时加O_LARGEFILE
- 用C语言获取任意文件的长度(可能大于2GB)#define _FILE_OFFSET_BITS 64
- Linux解决问题篇——ftp上传文件(使用put)时,permission denied,下载文件(使用get)时,failed to open file
- linux 最大文件打开数nofile及nr_open、file-max说明
- linux下设置最大文件打开数nofile及nr_open、file-max说明
- ORA-15025: could not open disk"...." ORA-27041: unable to open file Linux-x86_64 Error: 13: Permiss
- linux下C中文件操作及文件结构体:FILE,open(),close()
- linux下设置最大文件打开数nofile及nr_open、file-max说明
- Linux应用程序-文件编程-file_open()函数疑问
- Linux下设置最大文件打开数nofile及nr_open、file-max
- 拾记-linux-(./文件) 报错 cannot open shared object file: No such file or directory
- 从网络上下载的Linux单文件程序,无法运行,用File查看出现 ELF 64-bit LSB executable
- gcc -D_FILE_OFFSET_BITS=64
- linux下执行php文件Could not open input file的解决办法
- linux下执行php文件发现Could not open input file
- Linux 最大文件打开数nofile及nr_open、file-max介绍
- 使用OpenFileDialog选择文件
- 不能打开文件:mk:@MSITStore:路径[cannot open the file mk@MSITstore:路径]解决办法 转
- OpenFileDialog、SaveFileDialog常用屬性、對話框用法及得到系統特殊文件夾路徑