linux应用:静态文件、 inode(i 节点)、vnode、流

静态文件

定义

静态文件是指内容固定不变的文件,在服务器上以固定的格式存储,每次被请求时,服务器直接将其内容发送给客户端,不经过任何动态处理。常见的静态文件类型包括 HTML 文件、CSS 文件、JavaScript 文件、图片文件(如 JPEG、PNG、GIF 等)、音频文件(如 MP3、WAV 等)和视频文件(如 MP4、AVI 等)。

存储方式

静态文件以二进制数据的形式存储在硬盘的物理扇区中。硬盘会将文件的数据分割成多个小块,存储在不同的扇区里。为了管理这些分散的数据块,文件系统会使用索引或链表等数据结构来记录文件数据块的存储位置。

特点

内容固定:无论何时何地被访问,文件内容始终保持一致,除非手动修改文件本身。
加载速度快:由于不需要服务器进行额外的处理,直接从服务器传输到客户端,所以加载速度相对较快,能够快速呈现给用户。
易于缓存:可以在客户端或中间代理服务器上进行缓存,再次访问时无需再次从服务器获取,进一步提高访问效率,减轻服务器负担。

应用场景

适用于展示固定内容的场景,如网站的首页、产品介绍页面、静态资源文件等,这些内容不依赖于用户的操作或实时数据变化。

inode(i 节点)

定义

inode(index node,索引节点)是 Unix/Linux 文件系统中的一种数据结构,用于存储文件的元数据信息,每个文件和目录在文件系统中都有一个对应的 inode。inode 是文件系统管理文件的核心,它记录了文件的各种属性和数据块的存储位置等信息。

存储内容

文件基本信息:包括文件的类型(普通文件、目录、设备文件等)、文件权限(读、写、执行权限)、文件所有者和所属组、文件的创建时间、修改时间和访问时间等。
文件数据块指针:inode 中包含了指向文件数据块在硬盘上存储位置的指针。通过这些指针,文件系统可以快速定位到文件的数据块,从而读取或写入文件内容。对于大文件,可能会使用多级索引来管理数据块。

作用

文件标识:在文件系统中,每个 inode 都有一个唯一的编号,文件系统通过 inode 编号来识别和管理文件。文件名只是文件的一个外部标识,而 inode 才是文件的真正标识。
文件数据管理:inode 记录了文件数据块的存储位置,使得文件系统能够高效地组织和管理文件的数据。当需要读取或写入文件时,文件系统可以根据 inode 中的指针快速定位到相应的数据块。
文件共享:多个文件名可以指向同一个 inode,实现文件的硬链接。这样,多个文件路径可以访问同一个文件内容,节省了磁盘空间。

内存中被打开的文件

概念

当用户或程序通过系统调用(如 open 函数)请求打开一个文件时,操作系统会将文件的相关信息从磁盘加载到内存中,此时文件就处于被打开的状态。内存中被打开的文件不仅仅包含文件的实际数据内容,还包括一系列用于管理和操作该文件的信息。

相关数据结构

文件表项(File Table Entry):操作系统通常会维护一个全局的文件表,每个被打开的文件在文件表中都有一个对应的表项。文件表项包含了文件的当前偏移量(即文件指针的位置,指示下一次读写操作的起始位置)、访问模式(只读、只写、读写等)以及指向 vnode 的指针等信息。
用户文件描述符表:每个进程都有自己的用户文件描述符表,该表记录了该进程打开的所有文件的描述符(非负整数)与文件表项的映射关系。文件描述符是进程访问被打开文件的标识,通过文件描述符,进程可以方便地对文件进行读写等操作。

作用

提高访问效率:将文件加载到内存中,避免了每次访问文件都要进行磁盘 I/O 操作,大大提高了文件的访问速度。
支持并发访问:多个进程或线程可以同时打开同一个文件,通过文件表项和用户文件描述符表的管理,操作系统可以协调不同进程对文件的访问,确保数据的一致性和完整性。

vnode(v 节点)

概念

vnode(virtual node,虚拟节点)是一种抽象的数据结构,用于在操作系统中统一表示不同类型的文件系统对象,包括普通文件、目录、设备文件等。它是文件系统和内核之间的一个接口层,使得内核可以以统一的方式处理不同文件系统中的文件和目录。

存储内容

文件系统类型信息:记录了该文件所属的文件系统类型,如 ext4、NTFS 等。这使得内核可以根据不同的文件系统类型调用相应的处理函数。
inode 信息:vnode 中包含了指向文件对应的 inode(在磁盘文件系统中,inode 存储了文件的元数据信息)的指针,通过这个指针,vnode 可以获取文件的各种属性,如文件权限、所有者、文件大小等。
操作函数指针:vnode 中定义了一组操作函数指针,这些函数指针指向了对该文件进行各种操作的具体实现函数,如读、写、打开、关闭等操作。不同的文件系统会为这些操作函数提供不同的实现。

作用

抽象文件系统差异:不同的文件系统(如 ext4、FAT32 等)有不同的实现方式和数据结构,vnode 提供了一个统一的抽象接口,使得内核可以以相同的方式处理不同文件系统中的文件,提高了内核的可移植性和可扩展性。
支持文件系统挂载:当一个文件系统被挂载到某个挂载点时,vnode 可以将该文件系统中的文件和目录与内核中的文件系统树进行关联,使得用户可以像访问本地文件一样访问挂载文件系统中的文件。

内存中被打开的文件与 vnode 的关系

关联桥梁:内存中被打开的文件的文件表项中包含了指向 vnode 的指针,通过这个指针,文件表项可以与 vnode 建立关联。当进程通过文件描述符访问被打开的文件时,操作系统首先通过文件描述符找到对应的文件表项,然后通过文件表项中的 vnode 指针找到对应的 vnode,进而通过 vnode 中的操作函数指针调用相应的文件操作函数。
数据共享与一致性:多个进程同时打开同一个文件时,它们的文件表项可能会指向同一个 vnode,这使得不同进程可以共享文件的元数据信息和操作函数。同时,vnode 还负责维护文件数据的一致性,确保不同进程对文件的操作不会相互冲突。

文件

概念:

文件是存储在计算机存储设备(如硬盘、U 盘等)上的一组相关数据的集合,它具有唯一的文件名和文件路径,以方便用户和程序对其进行访问和管理。文件可以包含各种类型的数据,如文本、图像、音频、视频等。

组成部分:

文件名:用于标识文件的名称,通常由用户在创建文件时指定。文件名可以包含字母、数字、下划线和一些特定的字符,但不能包含操作系统保留的字符。
文件扩展名:通常由点号(.)后跟几个字符组成,用于表示文件的类型。例如,.txt 表示文本文件,.jpg 表示图像文件,.mp3 表示音频文件等。操作系统和应用程序可以根据文件扩展名来关联相应的程序来打开和处理文件。
文件内容:文件中实际存储的数据,可以是文本内容、二进制数据或其他特定格式的数据。

作用:

文件是计算机系统中数据持久化存储的主要方式,它允许用户和程序在不同的时间和地点访问和处理数据。文件可以用于存储用户的文档、程序代码、配置信息、多媒体数据等各种类型的数据。

概念:

流是一种抽象的概念,它表示数据的流动或传输。在程序中,流可以看作是一个连续的字节序列,数据从数据源(如文件、网络连接、键盘输入等)流向数据目的地(如文件、网络连接、显示器输出等)。流提供了一种统一的方式来处理不同类型的数据源和数据目的地,而无需关心底层的具体实现细节。

分类:

输入流:用于从数据源读取数据到程序中。例如,从文件中读取数据、从网络连接中接收数据或从键盘读取用户输入等都属于输入流操作。
输出流:用于将程序中的数据写入到数据目的地。例如,将数据写入到文件中、将数据发送到网络连接或在显示器上输出数据等都属于输出流操作。
特点:
顺序性:流中的数据是按照顺序依次读取或写入的,通常不能随机访问流中的数据。如果需要随机访问数据,可能需要使用其他数据结构或文件访问方式。
缓冲性:为了提高数据传输的效率,流通常会使用缓冲区来暂存数据。当从输入流读取数据时,数据会先被读取到缓冲区中,然后程序再从缓冲区中获取数据。当向输出流写入数据时,数据会先被写入到缓冲区中,当缓冲区满或流被关闭时,数据才会被真正写入到数据目的地。

作用:

流提供了一种方便、灵活的方式来处理数据的输入和输出,它使得程序可以以统一的方式处理不同类型的数据源和数据目的地,提高了程序的可移植性和可扩展性。同时,流的缓冲机制也可以提高数据传输的效率,减少底层设备的访问次数。

文件是数据的存储实体,而流是数据传输的抽象概念,在实际应用中,经常会使用流来对文件进行读写操作,即将文件作为流的数据源或数据目的地,通过流来实现对文件中数据的读取和写入。

文本文件写入操作

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 创建一个 ofstream 对象,用于向文件写入数据
    std::ofstream outFile("example.txt");

    // 检查文件是否成功打开
    if (outFile.is_open()) {
        // 写入文本内容
        outFile << "Hello, this is a test file." << std::endl;
        outFile << "This is the second line." << std::endl;

        // 关闭文件
        outFile.close();
        std::cout << "File written successfully." << std::endl;
    } else {
        std::cerr << "Unable to open file for writing." << std::endl;
    }

    return 0;
}

std::ofstream 是用于输出文件流的类,借助构造函数传入文件名来打开文件。
is_open() 函数用于检查文件是否成功打开。
<< 运算符用于向文件写入数据。
close() 函数用于关闭文件。

文本文件读取操作

#include <iostream>
#include <fstream>
#include <string>

int main() {
    // 创建一个 ifstream 对象,用于从文件读取数据
    std::ifstream inFile("example.txt");
    std::string line;

    // 检查文件是否成功打开
    if (inFile.is_open()) {
        // 逐行读取文件内容
        while (std::getline(inFile, line)) {
            std::cout << line << std::endl;
        }

        // 关闭文件
        inFile.close();
    } else {
        std::cerr << "Unable to open file for reading." << std::endl;
    }

    return 0;
}

std::ifstream 是用于输入文件流的类,通过构造函数传入文件名来打开文件。
std::getline() 函数用于逐行读取文件内容。
close() 函数用于关闭文件。

二进制文件写入操作

#include <iostream>
#include <fstream>

struct Person {
    char name[50];
    int age;
};

int main() {
    Person p = {"John Doe", 30};

    // 创建一个 ofstream 对象,以二进制模式打开文件
    std::ofstream outFile("binary_example.bin", std::ios::binary);

    // 检查文件是否成功打开
    if (outFile.is_open()) {
        // 写入二进制数据
        outFile.write(reinterpret_cast<const char*>(&p), sizeof(Person));

        // 关闭文件
        outFile.close();
        std::cout << "Binary file written successfully." << std::endl;
    } else {
        std::cerr << "Unable to open binary file for writing." << std::endl;
    }

    return 0;
}

std::ios::binary 标志用于以二进制模式打开文件。
write() 函数用于将二进制数据写入文件,需要把数据指针转换为 const char* 类型。

二进制文件读取操作

#include <iostream>
#include <fstream>

struct Person {
    char name[50];
    int age;
};

int main() {
    Person p;

    // 创建一个 ifstream 对象,以二进制模式打开文件
    std::ifstream inFile("binary_example.bin", std::ios::binary);

    // 检查文件是否成功打开
    if (inFile.is_open()) {
        // 读取二进制数据
        inFile.read(reinterpret_cast<char*>(&p), sizeof(Person));

        // 输出读取的数据
        std::cout << "Name: " << p.name << std::endl;
        std::cout << "Age: " << p.age << std::endl;

        // 关闭文件
        inFile.close();
    } else {
        std::cerr << "Unable to open binary file for reading." << std::endl;
    }

    return 0;
}

std::ios::binary 标志用于以二进制模式打开文件。
read() 函数用于从文件读取二进制数据,需要把数据指针转换为 char* 类型。

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

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

相关文章

Jetson Xavier NX安装CUDA加速的OpenCV

我们使用SDKManager刷机完成后&#xff0c;使用jtop查看&#xff0c;发现OpenCV 是不带CUDA加速的&#xff0c;因此&#xff0c;我们需要安装CUDA加速的OpenCV&#xff0c;这样后续在使用的时候速度会快很多。 首先我们先卸载默认OpenCV sudo apt purge libopencv* -y sudo …

基于PaddleNLP使用DeepSeek-R1搭建智能体

基于PaddleNLP使用DeepSeek-R1搭建智能体 最近在学习DeepSeek&#xff0c;找到了PaddleNLP星河社区大模型&#xff0c;跟着敲写了一遍。内容来源&#xff1a;DeepSeek实战训练营&#xff1a;从云端模型部署到应用开发 - 飞桨AI Studio星河社区-人工智能学习与实训社区 本项目基…

给大家推荐8个好玩有趣的网站

1、Home Apothecary 家庭药房 https://apothecary.tips/zh Home Apothecary&#xff08;家庭药房&#xff09;结合传统中医智慧与现代科学验证&#xff0c;提供涵盖睡眠改善、免疫力提升、肠胃调理、活力增强等健康需求的天然养生饮品配方。精选安神助眠、四季调养、舒缓压力…

使用Beanshell前置处理器对Jmeter的请求body进行加密

这里我们用HmacSHA256来进行加密举例&#xff1a; 步骤&#xff1a; 1.先获取请求参数并对请求参数进行处理&#xff08;处理成String类型&#xff09; //处理请求参数的两种方法&#xff1a; //方法一&#xff1a; //获取请求 Arguments args sampler.getArguments(); //转…

利用paddleocr解决图片旋转问题

由于之前使用easyocr识别图片的时候发现旋转的图片或者倒置的图片效果很差&#xff0c;来利用 cv2.minAreaRect()获取旋转角度&#xff0c;只能解决0-90&#xff0c;对于倒置的图片不能很好解决&#xff0c;因此使用paddleocr中方向分类检测&#xff08;只能返回0&#xff0c;1…

数据结构(蓝桥杯常考点)

数据结构 前言&#xff1a;这个是针对于蓝桥杯竞赛常考的数据结构内容&#xff0c;基础算法比如高精度这些会在下期给大家总结 数据结构 竞赛中&#xff0c;时间复杂度不能超过10的7次方&#xff08;1秒&#xff09;到10的8次方&#xff08;2秒&#xff09; 空间限制&#x…

Python 入

Python 入侵交换机 随着网络安全威胁不断增加&#xff0c;对于网络设备的安全防护变得愈发重要。而交换机作为网络中重要的设备之一&#xff0c;也需要加强安全保护。本文将介绍如何利用Python来入侵交换机&#xff0c;并对其进行漏洞扫描和安全检测。 1. Python 入侵交换机原…

自然语言处理:最大期望值算法

介绍 大家好&#xff0c;博主又来给大家分享知识了&#xff0c;今天给大家分享的内容是自然语言处理中的最大期望值算法。那么什么是最大期望值算法呢&#xff1f; 最大期望值算法&#xff0c;英文简称为EM算法&#xff0c;它的核心思想非常巧妙。它把求解模型参数的过程分成…

RAG 常见分块策略全解析:从原理到代码实践(2025 深度版)

大家好,我是大 F,深耕AI算法十余年,互联网大厂技术岗。 知行合一,不写水文,喜欢可关注,分享AI算法干货、技术心得。 更多文章可关注《大模型理论和实战》、《DeepSeek技术解析和实战》,一起探索技术的无限可能! 引言 在检索增强生成(RAG)系统中,分块策略是决定系统…

【软件逆向】QQ 连连看小游戏去广告与一键消除实现

目录 一、背景介绍 二、去广告实现 2.1 分析广告加载流程 2.2 逆向分析广告加载逻辑 2.3 去广告方案 三、一键消除外挂实现 3.1 分析游戏逻辑 3.2 编写外挂插件 3.3 注入外挂&#xff1a; 四、一键消除效果展示 五、额外扩展 一、背景介绍 QQ 连连看是一款经典的休闲…

小白学Agent技术[5](Agent框架)

文章目录 Agent框架Single Agent框架BabyAGIAutoGPTHuggingGPTHuggingGPT工作原理说明GPT-EngineerAppAgentOS-Copilot Multi-Agent框架斯坦福虚拟小镇TaskWeaverMetaGPT微软UFOAgentScope现状 常见Agent项目比较概述技术规格和能力实际应用案例开发体验比较ChatChain模式 Agen…

AI写论文提示词指令大全,快速写论文

目录 一、十大学术写作提示词1、研究主题2、研究问题3、论文架构4、学术论证5、文献关键要素6、专业文本可读性转换7、学术语言规范化8、提高语言准确性9、多维度、深层论证10、优化文本结构 二、快速写论文提示词1、确认研究选题2、整理相关资料3、快速完成论文大纲4、整合文献…

电子电气架构 ---常见车规MCU安全启动方案

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 简单,单纯,喜欢独处,独来独往,不易合同频过着接地气的生活,除了生存温饱问题之外,没有什么过多的欲望,表面看起来很高冷,内心热情,如果你身…

HCIP第二讲作业

一、连接拓扑图 二、配置要求 1.学校内部的HTTP客户端可以正常通过域名www.baidu.com访问到百度网络中的HTTP服务器 2.学校网络内部网段基于192.168.1.0/24划分&#xff0c;PC1可以正常访问3.3.3.0/24网段&#xff0c;但是PC2不允许 3.学校内部路由使用静态路由&#xff0c;R1…

Linux第六讲:进程控制

Linux第六讲&#xff1a;进程控制 1.进程创建1.1回顾fork1.2写时拷贝 2.进程终止2.1exit与_exit 3.进程等待3.1进程等待的方法&#xff08;wait和waitpid&#xff09; 4.进程程序替换4.1自定义shell的编写4.1.1输出命令行提示符4.1.2获取用户输入的命令4.1.3命令行分析4.1.4指令…

BI 工具响应慢?可能是 OLAP 层拖了后腿

在数据驱动决策的时代&#xff0c;BI 已成为企业洞察业务、辅助决策的必备工具。然而&#xff0c;随着数据量激增和分析需求复杂化&#xff0c;BI 系统“卡”、“响应慢”的问题日益突出&#xff0c;严重影响分析效率和用户体验。 本文将深入 BI 性能问题的根源&#xff0c;并…

PPT内视频播放无法播放的原因及解决办法

PPT内视频无法播放&#xff0c;通常是视频编解码的问题。目前我遇到的常见的视频编码格式有H.264&#xff0c;H.265&#xff0c;VP9&#xff0c;AV1这4种。H.264编解码的视频&#xff0c;Windows原生系统可以直接播放&#xff0c;其他的视频编码格式需要安装对应的视频编解码插…

【AIGC系列】6:HunyuanVideo视频生成模型部署和代码分析

AIGC系列博文&#xff1a; 【AIGC系列】1&#xff1a;自编码器&#xff08;AutoEncoder, AE&#xff09; 【AIGC系列】2&#xff1a;DALLE 2模型介绍&#xff08;内含扩散模型介绍&#xff09; 【AIGC系列】3&#xff1a;Stable Diffusion模型原理介绍 【AIGC系列】4&#xff1…

Navigation的进阶知识与拦截器配置

Navigation的进阶知识与拦截器配置 写的不是很详细&#xff0c;后续有时间会补充&#xff0c;建议参考官方文档食用 1.如何配置路由信息 1.1 创建工程结构 src/main/ets ├── pages │ └── navigation │ ├── views │ │ ├── Mine.ets //…

多模态推理模型相关开源工作

多模态推理模型相关开源工作 1. 训练策略1.1 R1-V① 介绍② 训练流程③ 关键注意点④ 主要问题⑤ 是否可以去掉 KL 约束&#xff1f; 1.2 open-r1-multimodal① 介绍② 代码改进 1.3 VisualThinker-R1-Zero① 研究意义② 训练方法③ 结论④ 代码改进⑤ 其他发现 1.4 Efficient-…