截断文件:truncate()和ftruncate()系统调用和LFS验证

简介 

truncate()和ftruncate()系统调用将文件大小设置为length参数指定的值。 

NAME
       truncate, ftruncate - truncate a file to a specified length

SYNOPSIS
       #include <unistd.h>
       #include <sys/types.h>

       int truncate(const char *path, off_t length);
       int ftruncate(int fd, off_t length);

        若文件当前长度大于参数length,调用将丢弃超出部分,若小于参数length,调用将在文件尾部添加一系列空字节或是一个文件空洞。
        两个系统调用之间的差别在于如何指定操作文件。truncate()以路径名字符串来指定文件,并要求可访问该文件,且对文件拥有写权限。若文件名为符号链接,那么调用将对其进行解引用。而调用ftruncate()之前,需以可写方式打开操作文件,获取其文件描述符以指代该文件,该系统调用不会修改文件偏移量。


        若ftruncate()的length参数值超出文件的当前大小,SUSv3允许两种行为:要么扩展该文件(如Linux),要么返回错误。而符合XSI标准的系统则必须采取前一种行为。相同的情况,对于truncate()系统调用,SUSv3则要求总是能扩展文件。
truncate()无需先以open()(或是一些其他方法)来获取文件描述符,却可修改文件内容,在系统调用中可谓独树一帜。

创建两个测试文件file1.txt file2.txt 

echo "hello world" > file1.txt
echo "hello world" > file2.txt

 测试一 :truncate例子

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <sys/epoll.h>
#include <sys/uio.h>
#include <limits.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif
static char *file_name = "writev.txt";
int main(int argc, char **argv)
{
    int fd;
    truncate("file1.txt",6);
    truncate("file2.txt",100);
    return 0;
}

 执行测试程序,执行后,文件长度分别变成了6和100.

 重新创建这两个文件

rm file*

 创建两个测试文件file1.txt file2.txt 

echo "hello world" > file1.txt
echo "hello world" > file2.txt

 测试二 :ftruncate例子

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <sys/epoll.h>
#include <sys/uio.h>
#include <limits.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif
static char *file_name = "writev.txt";
int main(int argc, char **argv)
{
    int fd1 = open("file1.txt", O_WRONLY);
    int fd2 = open("file2.txt", O_WRONLY);
    if(fd1 < 0 || fd2 < 0){
        perror("open");
        return -1;
    }
    int res1 = ftruncate(fd1,6);
    int res2 = ftruncate(fd2,100);
    if(res1 < 0 || res2 < 0){
        perror("ftruncate");
        return -1;
    }
    DEBUG_INFO("fd1 offset = %d",lseek(fd1,0,SEEK_CUR));
    DEBUG_INFO("fd2 offset = %d",lseek(fd2,0,SEEK_CUR));

    close(fd1);
    close(fd2);
    return 0;
}

执行之前,文件长度都是12

执行后,长度变为6和100

输出信息:表明 ftruncate不会改变文件位置。

测试三,LFS大文件验证

创建一个8GB的空洞文件。

#ifndef _GNU_SOURCE
#define _GNU_SOURCE
#endif
#include <sys/types.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
#include <sys/epoll.h>
#include <sys/uio.h>
#include <limits.h>

#define _DEBUG_INFO
#ifdef _DEBUG_INFO
#define DEBUG_INFO(format, ...) printf("%s:%d $$ " format "\n" \
,__func__,__LINE__ \
, ##__VA_ARGS__)
#else
#define DEBUG_INFO(format, ...)
#endif
static char *file_name = "writev.txt";
int main(int argc, char **argv)
{
    int fd1 = open("file1.txt", O_WRONLY);
    int fd2 = open("file2.txt", O_WRONLY);
    if(fd1 < 0 || fd2 < 0){
        perror("open");
        return -1;
    }
    long long_len_1 = 1*(long)1024*(long)1024*(long)1024;
    long long_len_2 = 8*(long)1024*(long)1024*(long)1024;
    DEBUG_INFO("%ld,%x",long_len_1,long_len_1);
    DEBUG_INFO("%ld,%x",long_len_2,long_len_2);

    DEBUG_INFO("%ld,%ld",sizeof(long_len_1),sizeof(off_t));
    int res1 = ftruncate(fd1,long_len_1);
    int res2 = ftruncate(fd2,long_len_2);
    if(res1 < 0 || res2 < 0){
        perror("ftruncate");
        return -1;
    }
    DEBUG_INFO("fd1 offset = %ld",lseek(fd1,0,SEEK_CUR));
    DEBUG_INFO("fd2 offset = %ld",lseek(fd2,0,SEEK_CUR));

    close(fd1);
    close(fd2);
    return 0;
}

执行后,如下所示:看到一个超级大的8GB的文件。 

$ ls -lsh file*
   0 -rw-rw-r-- 1 lkmao lkmao 1.0G 6月  28 21:08 file1.txt
4.0K -rw-rw-r-- 1 lkmao lkmao 8.0G 6月  28 21:08 file2.txt

小结 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32855.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java面试题【1】

Java面试题——Java部分 文章目录 Java面试题——Java部分选择题1.下面sum的值是&#xff08; D &#xff09;2.下面程序的运行结果&#xff08; A &#xff09;3.若x是float类型变量&#xff0c;x10/4; 则x的值是&#xff08; B &#xff09;4.以下程序的输出结果是&#xff0…

HTML系列

快捷键 表格快捷键&#xff1a;table>trn>tdn{a}&#xff08;n行n列&#xff0c;内容均为a&#xff09;无序列表快捷键&#xff1a;ul>li*n&#xff08;n代表无序列表的数量&#xff09; 对应表格快捷产出的样式&#xff08;不用管table内的参数设置&#xff0c;这里…

用UDP套接字实现客户端和服务端通信

IP地址和port端口号 IP地址 数据有IP(公网)标识一台唯一的主机。 port端口号 为了更好的标识一台主机上服务进程的唯一性&#xff0c;我们采用端口号port&#xff0c;标识服务器进程&#xff0c;客户端进程的唯一性&#xff01; ip端口号 IP地址(主机全网唯一性) 该主机上的端…

Redis7【⑦ Redis哨兵(sentinel)】

Redis哨兵 Redis Sentinel&#xff08;哨兵&#xff09;是 Redis 的高可用性解决方案之一&#xff0c;它可以用于监控和管理 Redis 主从复制集群&#xff0c;并在主节点发生故障时自动将从节点升级为新的主节点&#xff0c;从而保证系统的高可用性和可靠性。 Redis Sentinel …

Flex写法系列-Flex布局之基本语法

以前的传统布局&#xff0c;依赖盒装模型。即 display position float 属性。但是对于比较特殊的布局就不太容易实现&#xff0c;例如&#xff1a;垂直居中。下面主要介绍flex的基本语法。 一、什么是Flex布局&#xff1f; Flex布局个人理解为弹性盒子&#xff0c;为盒装模型…

【机器学习】——神经网络与深度学习

目录 引入 一、神经网络及其主要算法 1、前馈神经网络 2、感知器 3、三层前馈网络&#xff08;多层感知器MLP&#xff09; 4、反向传播算法 二、深度学习 1、自编码算法AutorEncoder 2、自组织编码深度网络 ①栈式AutorEncoder自动编码器 ②Sparse Coding稀疏编码 …

opencv编译

文章目录 一、编译前工作二、编译安装1、Windows2、Linux 一、编译前工作 进入下载页面https://github.com/opencv/opencv&#xff0c;下载指定.tar.gz源码包&#xff0c;例如&#xff1a;opencv-4.7.0.tar.gz。解压到指定目录。 二、编译安装 opencv构建时&#xff0c;需要…

chatgpt赋能python:使用Python连接网络摄像头

使用Python连接网络摄像头 网络摄像头是现代生活中不可或缺的设备之一&#xff0c;其允许用户在远程位置查看实时视频流。Python语言提供了强大的工具来连接和控制网络摄像头。本文将向您展示如何使用Python连接网络摄像头以及如何将视频流数据流式传输到本地计算机。 环境设…

OpenGL 鼠标拾取模型

1.简介 在我们的场景中&#xff0c;使用鼠标光标点击或“挑选”一个3d对象是很有用的。一种方法是从鼠标投射3d光线&#xff0c;通过相机&#xff0c;进入场景&#xff0c;然后检查光线是否与任何物体相交。这通常被称为光线投射。 我们不是从局部空间中的网格开始&#xff0c…

vscode 出现 No such file or directory 的解决办法(python tkinter)

问题 主要解决的问题是python在linux下包没办法安装的问题 Traceback (most recent call last): File “e:\Github\Python-GUI\PyQt-Fluent-Widgets\examples\navigation\demo.py”, line 202, in w Window() File “e:\Github\Python-GUI\PyQt-Fluent-Widgets\examples\na…

Python学习—装饰器的力量

Python学习—装饰器的力量 作为许多语言都存在的高级语法之一&#xff0c;装饰器是你必须掌握的知识点。 Python的装饰器&#xff08;Decorator&#xff09;允许你扩展和修改可调用对象&#xff08;函数、方法和类&#xff09;的行为&#xff0c;而无需永久修改可调用的对象本身…

leedcode-只出现一次的数字-异或

题目 题目 代码 class Solution { public:int singleNumber(vector<int>& nums) {int ansnums[0];for(int i1;i<nums.size();i){ansans^nums[i];}return ans;} };

C++ - 哈希的应用

前面的文章中我们讲解了如何进行哈希表的构建以及使用实现的哈希表来模拟实现unordered_map&#xff0c;在本文中我们将继续来讲解一下哈希的应用。 位图 问题引入 首先我们来引入一个问题&#xff1a;给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&am…

介绍 9 个研发质量度量指标

研发质量管理中的 MTTR、MTBF、MTTF、MTTD 都是什么&#xff1f;今天我们从生产事件的全生命周期出发&#xff0c;认识研发质量管理的 9 个度量指标——「MT 家族」。 01 Mean Time To ALL 「MT」是 Mean Time 的缩写&#xff0c;意为平均时间&#xff0c;「MT 家族」则是 Li…

【AcWing算法基础课】第一章 基础算法(部分待更)

文章目录 前言课前温习一、快速排序核心模板1.1题目描述1.2思路分析1.3代码实现 二、归并排序核心模板2.1题目描述2.2思路分析2.3代码实现 三、二分查找整数二分题目一3.1题目描述3.2思路分析3.3代码实现 浮点数二分题目二3.1题目描述3.2思路分析3.3代码实现 四、高精度加法核心…

记录--巧用 overflow-scroll 实现丝滑轮播图

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 前言: 近期我在项目中就接到了一个完成轮播图组件的需求。最开始我也像大家一样&#xff0c;直接选择使用了知名的开源项目 "Swiper"&#xff0c;但是后来发现它在移动端项目中某些测试环境…

函数调用的机器级表示

文章目录 1.Call和ret指令2. 如何访问栈帧里面的数据为什么栈底放在上面&#xff0c;栈顶放在下面X86中的寄存器EBP、ESP寄存器push 、pop 指令mov 指令总结如何访问栈帧 3. 如何切换栈帧函数调用时函数返回时 4. 完整的函数调用过程1. 一个函数的栈帧内包含哪些内容2. 汇编代码…

Jenkins 发送文件到远程服务器:Publish Over SSH 插件

Jenkins 发送文件到远程服务器&#xff1a;Publish Over SSH 插件 文章目录 Jenkins 发送文件到远程服务器&#xff1a;Publish Over SSH 插件一、Publish Over SSH 插件1、概述2、主要功能和特点3、插件主页4、安装 Publish Over SSH 插件5、配置远程主机 二、发送文件到远程主…

windows安装python开发工具pycharm

下载地址 PyCharm: the Python IDE for Professional Developers by JetBrains 点击下载 安装 双击exe安装等待安装完成即可 设置python环境 添加本地python环境 选择python.exe 所在路径即可&#xff0c;2.x版本和3.x版本都可&#xff0c;根据需要进行调整

【Spring】——Spring生命周期

前言 ❤️❤️❤️Spring专栏更新中&#xff0c;各位大佬觉得写得不错&#xff0c;支持一下&#xff0c;感谢了&#xff01;❤️❤️❤️ Spring_冷兮雪的博客-CSDN博客 前面我们讲完了Spring中有关Bean的读和取&#xff0c;我们还没有好好去了解了解Bean对象&#xff0c;这篇 …