笔记整理—内核!启动!—linux应用编程、网络编程部分(2)linux的文件管理策略

news2024/11/15 11:13:42

        关于硬盘中的静态文件与inode:例如文件存储在扇区中,一个文件占用10个字节,一个扇区为512字节,这样的情况下一个扇区就只放了一个实际为10字节的文件,余下的502字节不可存放其他文件,因为扇区已经是可以访问的最小单位了。

        所以,为了能够去索引到需要的文件,就有了硬盘中的索引表,如果表被破坏,文件就找不到了。

        

        这个表项就是inode,i节点,每个节点就是一个相关信息,每一个文件一个inode,一个inode就是一个结构体,一数字作为编号,通过遍历去寻找节点。

         格式化一般分为快速格式化和底层格式化。快速格式化,只是对表项进行删除没这样就找不到内容了,但本质上内容还在,能够被找回硬件的信息,但一般只能回复已知的格式的内容。底层格式化,就不单单只删除表项,删除的东西能恢复,但成本会很高。

        内存中被打开的文件与vnode(v节点):程序中打开的文件就属于这个进程,一个进程就有一个相应的数据结构(进程信息表),表中有一项指针,指向文件管理表,记录打开的文件与相关信息,表中信息打开的inode就是文件的fd,最终找到的文件管理结构体叫vnode。

        文件与流:流(stream)文件是一个栈(像一个栈)字符一个个读出、写入,形成流,是动态的,抽象出来的,文件操作时形成了IO流。

        

        文件指针:针对动态文件而言,在内存中以流的形式体现,文件流十分长,以何种心方式去体现位置,以文件指针表示在操作的位置,是文件管理表(结构体)中的一个指针。文件指针实际是vnode上的一个元素,表示了正在操作文件流的位置贸易lseek()函数进行间接访问。

        打开一个新问津默认打开lseek位置在开头write/read函数本会移动lseek指针,读n位就会移动n位。

        lseek也支持人为去改变文件的位置off_t lseek(int fd,off_t offset,int whence);offset为偏移量,whence为参照点(SEEK_SET文件头、SEEK_CUR当前位置、SEEK_END文件尾)。

        lseek返回成功的偏移量,read/write的读写位置受lseek操作。

        write写完内容时,lseek在尾部,所以这时候去read文件时,内容为空。

        用lseek计算文件的长度:linux中无api/函数去计算文件的长度,因为lseek可以做到这个功能。

ret=lseek(fd,0,SEEK_SET);将指针移到文件头
ret=lseek(fd,0,SEEK_END);计算从头到尾的长度
新打开一个文件,然后去计算从头到尾的偏移量

        使用lseek构建空洞文件,该文件没有字符(/t、/n都没有),用lseek去移动指针,写10个空洞字节,再写2字节的内容=12字节,空的文件是线程构建同一文件是有大用的。

        同一个进程多次(同时)打开同一个文件:

buf[20]={0};
fd1=open("a.txt",RDWR);
fd2=open("a.txt",RDWR);
ret1=read(fd1,buf,20);

memset(buf,0,sizeof(buf));
ret2=ret(fd2,buf,20);

结果fd1和fd2各自读各自的,lseek不是同一个,因为一个fd管理一个数据管理表。重复(同时)打开同一个文件进行写入,实际上是在内存中各写各的,最后写入硬盘时后者覆盖前者。

        接续写使用O_APPEND,核心还是lseek,移动自己的lseek时把另一个文件的lseek也给移动到相应的位置, O_APPEND对文件的操作是原子级别的,该操作不可被打断,原子操作是阻塞的,干不完活,后面的代码不会动。

       本章先写到这,下一章将对文件共享方面进行介绍。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门(07)标准输入输出_cin

文章目录 4.cin4.1 基本功能4.2 常见数据类型的输入4.3 cin多项输入中的分隔符如果需要将空格作为输入的一部分读入 4.4 使用 cin 一次读取多个整数方法一方法二 接上一篇 cout C入门(07)标准输入输出_cout、缓冲、\n endl 4.cin 4.1 基本功能 C 标准输入 cin 是一个控制台输…

LLMs之MemLong:《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读

LLMs之MemLong:《MemLong: Memory-Augmented Retrieval for Long Text Modeling》翻译与解读 导读:MemLong 是一种新颖高效的解决 LLM 长文本处理难题的方法,它通过外部检索器获取历史信息,并将其与模型的内部检索过程相结合&…

IPsec-VPN中文解释

网络括谱图 IPSec-VPN 配置思路 1 配置IP地址 FWA:IP地址的配置 [FW1000-A]interface GigabitEthernet 1/0/0 [FW1000-A-GigabitEthernet1/0/0]ip address 10.1.1.1 24 //配置IP地址 [FW1000-A]interface GigabitEthernet 1/0/2 [FW1000-A-GigabitEthernet1/0/2]ip a…

C#测试调用PdfiumViewer浏览PDF文件的基本用法

印章管理项目后续准备实现打开浏览PDF文件并进行盖章的功能,需要在Winform中使用控件在线浏览PDF文件,在网上找了几个开源的PDF浏览控件进行测试,以便应用于印章管理项目。本文测试调用PdfiumViewer模块打开及浏览PDF文件。   PdfiumViewer…

VisionPro - 基础 - 模板匹配技术和在VP中的使用 - PMAlign - PatMax(4)- 控制模板的匹配

前言: 针对PatMax 的高级应用和原理,在这一节继续进行说明:这一节主要考虑的是PatMax模板匹配的原理:如何控制模板的匹配。 本节先介绍了几个模板匹配的衡量标准,比如模板匹配分数,和模板的几种模板匹配的…

JAVA并发编程系列之Semaphore信号量剖析

腾讯T2面试,现场限时3分钟限最多20行代码,模拟地铁口安检进站。其中安检入口10个,当前排队人数是100个,每个人安检进站耗时5秒。开始吧! 候选人,心中万马奔腾!!!吐了一口82年老血&am…

re题(37)BUUCTF-[GWCTF 2019]xxor

BUUCTF在线评测 (buuoj.cn) 用ida打开文件,ctrle定位main函数 也可以用shiftF12查找字符串,找与我们解题有关的字符串 通过字符串定位到引用字符串的函数 进入main entry 但还不是我们要分析的代码 进入__libc_start_main中的main参数,是我们…

C++20 std::format

一、前言 1、传统 C 格式化的问题与挑战 可读性差:使用 C 中的 printf 和 scanf 家族函数进行格式化输出和输入时,它们的语法较为复杂,难以阅读。在较大的代码项目中,可读性差会导致维护困难。类型安全性差:printf 和…

IS-ISv4/6双栈

文章目录 IS-ISv4/6双栈实验要求配置 IS-ISv4/6双栈 实验要求 配置双栈 R1、2、3、4配置 IS-ISv4 和 IS-ISv6,配置IPv6多拓扑 上面为Level-1类型、中间为Level-1-2、下面是Level-2类型 还有就是说ATT位置1有一定要求连接L1/2连接L1或者L2类型路由器,至…

java23发布啦

2024年9月java23发布啦!!! JDK 23 提供了12 项增强功能,这些功能足以保证其自己的JDK 增强提案 - JEP ,其中包括 8 项预览功能和 1 项孵化器功能。它们涵盖了对 Java 语言、API、性能和 JDK 中包含的工具的改进。除了 Java 平台上…

KVM环境下制作ubuntu qcow2格式镜像

如果是Ubuntu KVM环境是VMware虚拟机,需要CPU开启虚拟化 1、配置镜像源 wget -O /etc/apt/sources.list https://www.qingtongqing.cc/ubuntu/sources.list2、安装kvm qemu-img libvirt kvm虚拟化所需环境组件 apt -y install qemu-kvm virt-manager libvirt-da…

安装黑群晖,并使用NAS公网助手实现DDNS动态域名解析

很多人都会安装安装一个黑群晖进行练手,黑群晖有很多玩法和NAS套件,而且黑群晖安装比较简单,没有复杂的步骤,这也是很多人玩黑裙的理由,这里教大家如何安装黑群晖,并且安装神卓互联NAS公网助手实现DDNS动态…

arthas -- xxljob本地调试

方案一:测试类 package cn.wanda.wic.content.job.xxljob;import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest;import javax.annotation.Resource;SpringBootTest public class ShopResourceMigrationJobTest {Reso…

C\C++内存管理详解

本次内容大纲: 1.C/C内存分布 大家看看下面的代码 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";char* pChar3 "abcd";int…

本地快速部署一个简洁美观的个人Halo博客网站并发布公网远程访问

文章目录 前言1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可参考已安装Docker步骤:1.2 在Docker中部署Halo 2. Linux安装Cpolar2.1 打开服务器防火墙2.2 安装cpolar内网穿透 3. 配置Halo个人博客公网地址4. 固定Halo公网地址 前言 本文主要介绍如何在Cen…

【Python日记】好丝滑的贪吃蛇

文章目录 原文:https://blog.c12th.cn/archives/39.htmlPython 贪吃蛇(pygame)前言部分代码完整代码 原文:https://blog.c12th.cn/archives/39.html Python 贪吃蛇(pygame) 前言 源代码参考B站: BV1cs411T7wW 效果展示 部分代码 框架 # 初始化 pygam…

基于微信小程序校园订餐的设计与开发+ssm(lw+演示+源码+运行)

摘 要 人民生活水平的提高就会造成生活节奏越来越快,很多人吃饭都采用点外卖的方式。现在点外卖的平台已有很多,大多都需要安装它们的APP才可以使用,并且没有针对校园。如果一味的使用外卖平台不仅会造成商家成本的增加,还不利于…

django应用JWT(JSON Web Token)实战

文章目录 一、什么是JWT二、为什么使用JWT三、在django项目中如何应用JWT1、安装djangorestframework-simplejwt库:2、在settings.py中配置JWT认证:3、在urls.py中配置JWT的获取和刷新路由: 四、JWT如何使用1、调用生成JWT的接口获取JWT2、客…

C++:类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast)、RTTI

C:类型转换(static_cast、reinterpret_cast、const_cast、dynamic_cast)、RTTI 一、C语言类型转换二、C新增强制类型转换2.1 新增类型转换:static_cast2.2 新增类型转换: reinterpret_cast2.3 新增类型转换&#xff1a…

新手上路:在Windows CPU上安装Anaconda和PyCharm

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一. 确认自己是CPU为什么选择CPU教程?GPU与CPU的区别如何判断自己是CPU 二. Anaconda 安装包 和 Pycharm 安装包步骤1:下载Anaconda步骤2&am…