linux生成4g文件,linux中创建超过4g文件的方法-o_largefile?
支持大文件的两种方式:
1、gcc 加 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE
2、注意一定要定义在include之前
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
建议两种方式都加上。
如何create大文件
要大就非常大,1T吧。
有两种方法:
一.dd
dd if=/dev/zero of=1T.img bs=1G seek=1024 count=0
bs=1G表示每一次读写1G数据,count=0表示读写0次,seek=1024表示略过1024个Block不写,前面block size是1G,所以共略过1T!
这是创建大型sparse文件最简单的方法。
二.ftruncate64/ftruncate
如果用系统函数就稍微有些麻烦,因为涉及到宏的问题。我会结合一个实际例子详细说明,其中OPTION标志的就是测试项。
文件sparse.c:
//OPTION 1:是否定义与大文件相关的宏
#define _LARGEFILE_SOURCE
#define _LARGEFILE64_SOURCE
#define _FILE_OFFSET_BITS 64
#include
#include
#include
#include
#include
#include
#define FILENAME "bigfile"
#define FILE_MODE (S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)
int main(int argc, char **argv)
{
int fd, ret;
off_t offset;
int total = 0;
if ( argc >= 2 )
{
total = atol(argv[1]);
printf("total=%d\n", total);
}
//OPTION 2:是否有O_LARGEFILE选项
//fd = open(FILENAME, O_RDWR|O_CREAT|O_LARGEFILE, 0644);
fd = open(FILENAME, O_RDWR|O_CREAT, 0644);
if (fd < 0) {
perror(FILENAME);
return -1;
}
offset = (off_t)total *1024ll*1024ll*1024ll;
printf("offset=%ld\n", offset);
//OPTION 3:是否调用64位系统函数
//if (ftruncate64(fd, offset) < 0)
if (ftruncate(fd, offset) < 0)
{
printf("[%d]-ftruncate64 error: %s\n", errno, strerror(errno));
close(fd);
return 0;
}
close(fd);
printf("OK\n");
return 0;
}
测试环境:
linux:/disk/test/big # gcc --version
gcc (GCC) 3.3.5 20050117 (prerelease) (SUSE Linux)
linux:/disk/test/big # uname -a
Linux linux 2.6.11.4-20a-default #1 Wed Mar 23 21:52:37 UTC 2005 i686 i686 i386 GNU/Linux
测试结果(伪码表示):
1.宏定义完全的情况下:
IF {O_LARGEFILE=TRUE && ftruncate64=TRUE}
OK;
ELSEIF {O_LARGEFILE=FALSE && ftruncate64=TRUE}
OK;
ELSEIF {O_LARGEFILE=FALSE && ftruncate64=FALSE}
运行不报错,但是不支持>4G;
ELSEIF {O_LARGEFILE=TRUE && ftruncate64=FALSE}
运行不报错,但是不支持>4G;
【结论】:在宏定义完全的情况下,是否调用ftruncate64,是决定支持4G以上文件的关键,O_LARGEFILE无作用。
2.宏定义不完全:缺少_FILE_OFFSET_BITS
首先声明一点,O_LARGEFILE需要定义_LARGEFILE64_SOURCE。
IF {O_LARGEFILE=TRUE && ftruncate64=TRUE}
产生不正常超大文件;
ELSEIF {O_LARGEFILE=FALSE && ftruncate64=TRUE}
产生不正常超大文件;
ELSEIF {O_LARGEFILE=FALSE && ftruncate64=FALSE}
运行不报错,但是不支持>2G;
ELSEIF {O_LARGEFILE=TRUE && ftruncate64=FALSE}
运行不报错,但是不支持>4G;
【结论】:未定义_FILE_OFFSET_BITS的情况下,ftruncate64调用是非法的,会产生无法预料的后果,这里的测试就是产生一个超大文件(>1T),我也无法解释其原因;O_LARGEFILE的作用就是在32位系统中支持大文件系统,允许打开那些用31位(2G)都不能表示其长度的大文件;此外,off_t为 unsigned int类型,也就是说最多只能达到4G,所以ftruncate最大支持4G文件。
总结一下:如果要支持超过2G的文件,至少需要定义 _LARGEFILE64_SOURCE宏,并且设置O_LARGEFILE选项;如果要支持超过4G,需要定义所有上述的宏,并且调用 ftruncate64;其余的搭配都是错误的!
【附】:
dd 的主要选项:
指定数字的地方若以下列字符结尾乘以相应的数字:
b=512, c=1, k=1024, w=2, m=1024k, g=1024m
大小写不限。
if=file
输入文件名,缺省为标准输入。
of=file
输出文件名,缺省为标准输出。
ibs=bytes
一次读入 bytes 个字节(即一个块大小为 bytes 个字节)。
obs=bytes
一次写 bytes 个字节(即一个块大小为 bytes 个字节)。
bs=bytes
同时设置读写块的大小为 bytes ,可代替 ibs 和 obs 。
cbs=bytes
一次转换 bytes 个字节,即转换缓冲区大小。
skip=blocks
从输入文件开头跳过 blocks 个块后再开始复制。
seek=blocks
从输出文件开头跳过 blocks 个
linux生成4g文件,linux中创建超过4g文件的方法-o_largefile?相关推荐
- java中写入文件_java中创建、写入文件的5种方式
在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. Files.newBufferedWriter(Java 8) Files. ...
- java在linux创建文件_Java中创建并写文件的5种方式
导读 在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下面笔者就帮大家总结一下java中创建文件的五种方法. 在java中有很多的方法可以创建文件写文件,你是否真的认真的总结过?下 ...
- python怎么创建文件夹_如何使用python在文件夹中创建文本文件?
我试图在一个不是运行脚本的目录的文件夹中创建一个.txt文件.我有一个脚本所在的文件夹,我可以在脚本所在的同一个目录中创建该文件夹,但它不会在该文件夹中创建文本文件.我通常遇到两个错误中的一个:Per ...
- linux如何生成tar文件内容,在Linux系统中创建tar.gz文件的方法及实例讲解
本文介绍在Linux系统中创建tar.gz文件的方法,及实例讲解. 介绍 tar存档是一个文件,用于存储其他文件的集合,包括有关它们的信息,例如所有权.权限和时间戳. 在Linux操作系统中,可以使用 ...
- linux 获取文件父目录权限,Linux 文件权限中,操作一个文件需要父目录的那些权限?...
eudore:linux 文件权限中,操作一个文件需要父目录的那些权限? 是否需要检查每级目录?想找到一份完整规范正确的指导,自己在写检查 linux 用户文件权限的代码. 例如读取一个文件 /hom ...
- Linux 命令行访问名字中包含空格的文件或文件夹
Linux 命令行访问名字中包含空格的文件或文件夹 在 Windows 下命名文件或文件夹名有空格是可以的,甚至在 Windows 和 Ubuntu 虚拟机共享的文件中也可以这么做,但是在 Ubunt ...
- linux 查看硬盘的uuid_Ubuntu中查看硬盘分区UUID的方法(所有Linux目录的解释)
在Ubuntu中UUID的两种获取方法,至于UUID是什么,你可以大概理解为分区的标识符,像条形码那样. 在终端中输入下面的命令就可心查看到分区UUID了. 命令1. sudo blkid 命令2. ...
- 如何在文件夹中创建nodeJs项目
打开所在要创建的项目文件夹 首先在你的电脑上必须要装有node.js,否则一切都是空谈. 在项目文件夹中创建package.json npm init 有了package.json文件,直接使用npm ...
- [OpenCV] 练习题实现代码 使用 cv.addWeighted 函数在文件夹中创建图像的幻灯片放映,并在图像之间进行平滑过渡
1.问题背景 opencv 官方手册 文档 练习题 练习题实现代码 使用 cv.addWeighted 函数在文件夹中创建图像的幻灯片放映,并在图像之间进行平滑过渡 2.代码部分 按任意键切换幻灯片 ...
- VirtualBox问题——无法在父文件夹中创建虚拟文件夹
创建新系统提示无法在父文件夹中创建虚拟文件夹 解决:以管理员的身份运行VirtualBox
最新文章
- 2022-2028年中国企业核心路由交换机行业市场前瞻与投资分析报告
- collect的功能是什么?其底层如何实现的?_用Python实现定时自动化收取蚂蚁森林能量,再也不怕被偷了
- Mysql数据库常用命令,mysql速学实用教程。
- windows c语言目录操作函数,c语言目录操作在C/C++语言中如何进行目录操作,如得到目录内的 爱问知识人...
- P NP NPC NP hard
- 2018-2019-20175203 实验二 《Java面向对象程序设计》
- 《JavaScript高级程序设计》阅读笔记(十五):浏览器中的JavaScript
- oracle删除数据用户,oracle删除用户及表空间,导入用户和数据
- c语言吧五子棋纯干货注释,请帮我注释下这个五子棋程序
- HDFS的命令行使用【常用 hdfs 命令】
- 华硕Chromebox-cn 62+i7-5500 U+HD 5500
- 【2023】上海交通大学计算机考研信息汇总
- Fantastic-Matplotlib 第一回
- 细说 Java 中的浅克隆与深克隆
- 苹果手机上滑动会卡顿_苹果手机Safari浏览器下滑动卡顿的问题
- 数字视频压缩的可行性
- [Python图像处理] 二十九.MoviePy视频编辑库实现抖音短视频剪切合并操作
- 李宏毅老师官方授权!《李宏毅机器学习特训营》发布,放心免费学!
- 传感器与检测技术基础知识(5)—— 电容式传感器
- 人脸识别显示内部服务器显示错误,百度人脸识别——人脸搜索,出现222207错误(未找到匹配用户)怎么解决...
热门文章
- 华为网络拒绝接入_为何华为手机网络拒绝接入
- mac上的android模拟器下载安装,Mac电脑上安装安卓模拟器,Mac如何安装Android模拟器...
- PRD之道:活用Axure快速撰写轻便的需求文档
- [QCTF2018]X-man-Keyword
- 靶机-droopyCTF Walkthrough
- 用简单的Python HTTP server来共享文件
- CDR是什么软件?用来做什么的,CorelDRAW版本更新历史及快捷键教程分享下载
- Buckhorn跳羚声卡驱动安装设置方法
- puppeteer实现网页截图
- 2021世界量子计算机排名,2021 QS世界大学学科排名如期出炉啦!