Linux下的文件系统(进程与文件)

windows下的文件构成

.内容

.属性 

所以, 文件的构成为内容和属性。

文件 = 内容 + 属性

推此即彼, linux下的文件构成也是如此。

liunx下,文件 = 文件的内核数据结构(属性)+内容

深入理解c语言中的文件操作

在c语言中如果想要操作一个文件必须打开,这是为什么?

文件没有被打开前文件在哪里?-> 在磁盘里,被打开后被加载进内存。

还有,文件是由谁打开的? -> 进程。

所以,之所以文件被操作需要被打开,是因为,根据冯诺依曼体系结构,cpu只与内存直接打交道,不与磁盘直接打交道(间接打交道),所以cpu想要修改文件,就需要将文件打开加载到内存。

Linux OS,是如何管理文件?

顶层想法是,先描述,再组织。

liunx下,文件 = 文件的内核数据结构(属性)+内容

如果想解决以上的问题,需要了解一下进程与文件的关系。

系统调用接口

1.open

pathname: 填写想要打开文件的路径(绝对路径);也可以直接写想要创建的文件名,但该文件就是在进程所在的路径下创建的,这是为什么呢?

每个进程都有cwd(current work direcotry)指向当前的路径,所以编译器在编译时会自动补齐对应的路径信息。

该文件在  /proc/该进程的pid 下

flags: 标志位,标志位间用 |连接,标志位的类似于位图

常见的标志位

O_CREAT:创建

O_WRONLY:只写

O_RDONLY:只读

O_TRUNC:将文件清零

O_APPEND:追加

使用

 int fd = open("log.txt",O_CREAT|O_WRONLY|O_TRUNC);//相当于fopen("log.txt","w");
  
 int fd = open("log.txt",O_CREAT|O_WRONLY|O_APPEND);  //fopen("log.txt","a");
 
 int fd = opne("log.txt",O_RDONLY);//fopen("log.txt","r");

mode:就是创建文件时的umask权限,每个进程都有一个自己的umask

返回值是int:是文件描述符fd(>=0),如果open打开失败那么就返回-1。

2.write

3.close

进程与文件

文件描述符的分配规则

在c语言中,我们知道一个进程被启动会默认打开三个标准输入输出流

文件流    文件描述符

stdin       0  (标准输入)

stdout     1 (标准输出)

stderr      2 (标准错误)

#include <iostream>
using namespace std;
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
        int fd = open("log.txt",O_CREAT|O_WRONLY|O_TRUNC,0666);
        int fd1 = open("log1.txt",O_CREAT|O_WRONLY|O_TRUNC,0666);
        int fd2 = open("log2.txt",O_CREAT|O_WRONLY|O_TRUNC,0666);
        int fd3 = open("log3.txt",O_CREAT|O_WRONLY|O_TRUNC,0666);
        cout<<fd<<endl;
        cout<<fd1<<endl;
        cout<<fd2<<endl;
        cout<<fd3<<endl;

        return 0;
}

从结果可以看出,一个进程运行起来后,打开的文件是从三开是往后分配的,并且是连续分配的,原因是0 ,1,2被默认打开了。

分配规则:分配最小的,没有被使用的

为什么文件描述符是一个整数呢? 

LInux2.60的内核源代码

每个进程里都有维护的files_struct指针,files_struct中又维护这一个struc file的数组,struct file就描述了了一个文件,所以每个进程就可以通过open返回的fd(int)就可以标识一个文件。 



理解linux os下一切皆文件

说直白一点就是linux os就是通过操作文件的方式对各种外设进行读写操作的。

来探究一下怎么办?

struct file中维护了操作表,在操作表中有相应功能的函数指针来完成读写,因为不同的外设的I/O方式不同,所以初始化函数指针不同,在struct file看来调用向应的write和read函数就可以从相应的设备中读取数据

这种调用相同的函数但函数执行的结果会根据对象不同而不同的特性在c++中叫什么来着?

多态,以上的方式就类似于c++中的多态。

举个例子:

linux在打开一个外设时,会描述这个外设(struct device),并通过特定的数据结构组织并管理,创建相应的struct file,struct file中相应的外设的特定的读写方法,这样系统就可以以文件的方式,读写硬件的数据了。

总结,通过struct file就可已屏蔽底层的不同,用统一的方法进行操作,而这个操作就是文件操作,所以在linux下一切皆文件。

vfs(virtual file system)虚拟文件系统

struct FILE

就linux而言

通过以上的了解可以知道c语言struct FILE就是封装的系统的struct file

fopen对应的就是open

fclose 则是close

为什么语言喜欢封装? c/c++

1.方便用户的使用

封装的函数,更容易让用户去理解和使用,不用过多考虑底层,因为封装都已经解决了底层的问题。

2.提过语言的可移植性

每个系统的调用接口不同,比如fopen底层使用的是类似于open的系统调用接口,在linux系统中调用的是linux的open,而在windows下调用的是windows下的open,这就导致同一份代码,用linux系统调用接口,而代码如果在windows就跑步了。

而封装解决了这个问题,使语言具有可移植性。

总结,一句就是封装屏蔽了系统接口的差异,使在不同的系统中调用该系统的接口。

内核级文件缓冲区

是什么?

内核缓存区 当一个用户进程要从磁盘读取数据时,内核一般不直接读磁盘,而是将内核缓冲区中的数据复制到进程缓冲区中。 但若是内核缓冲区中没有数据,内核会把对数据块的请求,加入到请求队列,然后把进程挂起,为其它进程提供服务。

为什么?

内存的读写快,而磁盘的读写慢,为了提高内存与磁盘建的I/O效率,通过将想要的数据先写入缓冲区,在刷新进磁盘的策略来减少I/O次数。

怎么样(如何刷新)?

注意:内核级文件缓冲区,不受用户操作,什么时候刷新,都由操作系统自主决定

那么可能就有人要问了,fflush不是刷新缓冲区吗?

fflush是刷新缓冲区,但fflush()函数刷新的是用户级缓冲区

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

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

相关文章

【笔记】LLM位置编码之标准位置编码

标准位置编码 起源原理证明&#xff1a;对于任何固定的偏移量 k k k&#xff0c; P E p o s k PE_{posk} PEposk​可以表示为 P E p o s PE_{pos} PEpos​的线性函数。计算 P E p o s k 与 P E p o s PE_{posk} 与PE_{pos} PEposk​与PEpos​的内积结论 通俗理解缺点 起源 由…

论文笔记:LaDe: The First Comprehensive Last-mile Delivery Dataset from Industry

2023 KDD 1 intro 1.1 背景 随着城市化进程的加快和电子商务的发展&#xff0c;最后一公里配送已成为一个关键的研究领域 最后一公里配送&#xff0c;如图1所示&#xff0c;是指连接配送中心和客户的包裹运输过程&#xff0c;包括包裹的取件和配送除了对客户满意度至关重要外…

诺基亚的裁员风暴

大家好&#xff0c;我是鸭鸭&#xff01; 不知道 80、90 后还记得童年神机诺基亚吗&#xff1f; 虽然诺基亚早就把自家手机业务出售&#xff0c;但依然是一代通信巨头。 鸭鸭最近看到新闻&#xff0c;诺基亚已经在大中华区裁减了近 2000 名员工 。 根据 2023 年底&#xff0…

YOLOv8实战野生动物识别

本文采用YOLOv8作为核心算法框架&#xff0c;结合PyQt5构建用户界面&#xff0c;使用Python3进行开发。YOLOv8以其高效的实时检测能力&#xff0c;在多个目标检测任务中展现出卓越性能。本研究针对野生动物数据集进行训练和优化&#xff0c;该数据集包含丰富的野生动物图像样本…

9.Linux按键驱动-工作队列

1.思路 1.1在gpio结构体中定义工作队列 1.2 在probe函数中初始化工作队列 1.3.在中断服务程序中调度工作队列 1.4工作队列处理函数&#xff1a; 2.编程 程序&#xff1a; #include <linux/module.h> #include <linux/fs.h> #include <linux/errno.h> #…

C语言程序设计:现代设计方法习题笔记《chapter6》下篇

第七题 square3.c代码 #include<stdio.h>int main() { int i, n, odd, square;printf("This program prints a table of squares.\n");printf("Enter number of entries in table: ");scanf_s("%d", &n);i 1;odd 3;for (square 1;…

数据库课程 第一周

1.数据库的安装与卸载 1.1数据库的卸载&#xff1a; &#xff08;1&#xff09;第一种卸载方式&#xff1a;删除文件目录 &#xff08;2&#xff09;第二种卸载方式&#xff1a;在控制面版中卸载&#xff0c;然后在c盘里找到mysql文件删除 1. 2.在隐藏目录programdata里 1.2…

新王Claude 3.5的6大应用场景

Anthropic AI深夜发布了备受期待的Claude 3.5系列更新&#xff0c;包括了全新升级的Claude 3.5 Sonnet和首发的Claude 3.5 Haiku。 Claude 3.5 Sonnet能够理解细微的指令和上下文&#xff0c;识别并纠正自身错误&#xff0c;还能从复杂数据中生成深入的分析和洞察。 结合最先进…

从零入门扣子Bot开发

从零入门扣子Bot开发 工作流简单介绍问题思考工作流实例 图像流简单介绍瘦脸图像流的设计创建图像流设计流程 总结参考链接 工作流简单介绍 工作流起源于生产组织和办公自动化领域&#xff0c;是指在计算机应用环境下&#xff0c;对业务过程的部分或整体进行自动化处理。它通过…

文理学院数据库应用技术实验报告0

文理学院数据库应用技术实验报告0 实验内容 打开cmd,利用MySQL命令连接MySQL服务器。 mysql -u root -p查看当前MySQL服务实例使用的字符集(character)。 SHOW VARIABLES LIKE character_set_server;查看当前MySQL服务实例支持的字符序(collation)。 SHOW VARIABLES LIKE c…

Unity编辑器 连接不到SteamVR问题记录

问题表现&#xff1a;之前正常的工程&#xff0c;某天打开后运行&#xff0c;在SteamVR未打开时&#xff0c;Unity工程运行后无法调用起来Steam VR&#xff0c;无任何反应&#xff0c;但用其他软件则可以调用起来SteamVR&#xff0c;并且运行正常&#xff0c;在重装了XR的一些插…

【网络面试篇】从输⼊ URL 到⻚⾯展示到底发⽣了什么?

目录 一、大致流程 1. 流程概述 2. 全流程描述 二、流程解析 1. URL 解析 2. DNS 查询 3. TCP 连接 4. 渲染页面 一、大致流程 1. 流程概述 &#xff08;1&#xff09;URL 解析 &#xff08;2&#xff09;DNS 查询 &#xff08;3&#xff09;TCP 连接 &#xff08…

「C/C++」C/C++标准库之#include<cstdlib>通用工具库

✨博客主页何曾参静谧的博客&#x1f4cc;文章专栏「C/C」C/C程序设计&#x1f4da;全部专栏「VS」Visual Studio「C/C」C/C程序设计「UG/NX」BlockUI集合「Win」Windows程序设计「DSA」数据结构与算法「UG/NX」NX二次开发「QT」QT5程序设计「File」数据文件格式「PK」Parasoli…

消息会话—发送消息自动滚动到最底部

背景 在项目开发中&#xff0c;实现用户友好的输入交互是提升用户体验的关键之一。例如&#xff0c;在消息会话页面中&#xff0c;为了确保用户在发送新消息后页面能自动滚动到最底部&#xff0c;从而始终保持最新消息的可见性&#xff0c;需要实现自动滚动功能。这不仅提升了…

【教程】如何查看IEEE会员证书Membership Card

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 1、先打开以下网站&#xff0c;并登录你的账号&#xff1a; https://www.ieee.org/profile/myprofile/myprofile.html 2、如果你没有缴费注册会员&…

ENGAGE SHE连锁品牌盛启,寻找更多城市合伙人

在这个充满个性与品质追求的时代,饰品已悄然超越了单纯装饰的范畴,它成为了每个人独特个性的展现,是生活态度的鲜明宣言。自2021年成立以来,ENGAGE SHE凭借其“自在、自然、清新”的独特品牌风格,以及“简约、品质、设计”的核心理念,迅速在时尚界掀起了一股清新之风,赢得了无数…

Segugio:一款针对恶意软件的进程执行跟踪与安全分析工具

关于Segugio Segugio是一款功能强大的恶意软件安全分析工具&#xff0c;该工具允许我们轻松分析恶意软件执行的关键步骤&#xff0c;并对其进行跟踪分析和安全审计。 Segugio允许执行和跟踪恶意软件感染过程中的关键步骤&#xff0c;其中包括从点击第一阶段到提取恶意软件的最…

中航资本:什么是主板创业板及科创板?主板创业板及科创板有什么区别?

什么是主板创业板及科创板&#xff1f; 主板、创业板和科创板都是股票商场的组成部分。 主板商场分为沪市主板和深市主板&#xff0c;首要服务与有安稳的盈利才华、较大的本钱规划和较强的商场竞争力的企业。 创业板首要服务于成长型、中小型、高新技术企业等&#xff0c;包…

1.3 面向对象 C++面试问题

1.3.1 简述一下什么是面向对象,面向对象与面向过程的区别 什么是面向对象 面向对象&#xff08;Object-Oriented Programming&#xff0c;OOP&#xff09;是一种编程范式&#xff0c;它通过将现实世界中的实体抽象为“对象”来组织代码。面向对象编程关注对象及其交互&#x…

酷睿 Ultra 200S核显相当于GTX 1050Ti?4核心表现出人意料

原文转载修改自&#xff08;更多互联网新闻/搞机小知识&#xff09;&#xff1a; 酷睿 Ultra 200S核显评测&#xff0c;GTX 1050Ti水平能玩3A 酷睿 Ultra 200S系列CPU是真没什么好聊的&#xff0c;不过作为陪衬&#xff0c;毫无存在感的Arc核显倒还算真的有点意思&#xff0c;…