当前位置: 首页 > news >正文

【Linux】基础IO认知

文件

  • 1、回顾C语言中的文件接口
  • 2、对文件的理解(阶段一)
  • 3、文件操作
    • 3、1、C++的文件操作接口
    • 3、2、认识系统调用接口
    • 3、2、强化对fd文件描述符及周边知识的理解

1、回顾C语言中的文件接口

事实上,我们在C语言的学习中了解的文件并不是真正的文件。从语言角度来说,我们没有真正的理解文件的含义 。又由于所有的语言几乎都能够对文件就行操作,但是每一个语言都不相同,谁给的勇气让他这么做呢?那一定是操作系统啊,在操作系统方面上的相同,让文件操作有着多种的可能,所以我们想要真正的理解文件,我们就得从操作系统上来理解。 但是我们还是,首先回顾先回顾一下代码的层次。
在这里插入图片描述
对于“W”来说,表示的含义是如果不存在,就在当前目录下,新建指定的文件。默认打开文件的话,会先默认清空文件中的内容
但是,这个写完的程序在进行的时候,程序怎么知道,在哪里找文件,程序怎么知道没有文件之后,直接就在所谓的当前目录下就直接创建的呢?
问题就是可执行程序是如何知道在当前目录之下? 答案是打开文件是在进程的基础下打开的,进程在启动的时候,就会有当前进程的运行的工作路径。所以打开文件,创建文件都在这个路径下创建的。
我们进行文件操作,前提是我们的程序跑起来了,文件打开和关闭,都是CPU在执行我们的代码。
除此之外,还有“a”操作,他的含义就是追加,不会清空文件在这里插入图片描述

2、对文件的理解(阶段一)

所以,对文件的打开其实就是进程打开文件。
文件没有被打开的时候,会存在于磁盘上。
一个进程也能打开很多文件。 一个系统中又能够存在多个进程,所以很多时候,OS系统内部,一定存在大量的被打开的文件,所以大量的打开的文件,OS必须要对这些文件进行合理的管理。怎么管理呢?先描述,再组织。所以可以大胆的猜一猜,对于每一个被打开的文件。在OS内部,一定存在这对应的描述文件属性的结构体,类似PCB。
所以最后在内核进程的结构体中,我们应该能够看到PCB的结构体内部,有指向一个对文件属性控制的结构体指针。
不止是这些的C语言中的对于代码的修改,在Linux操作系统上的echo进行重定向,也能够对文件内容进行修改,所以输出重定向一定是文件操作,并且每次重定向写入的方式是先清空,再写入,其实根本上,这个输出重定向也就是按照w的方式进行打开的
所以既然知道了 > 的含义就是w的方式打开文件,那我们也能够这样直接创建文件。也能够直接 > 的方式重新刷新文件内容。
在这里插入图片描述
当然,> 表示的是w,那么其中也有表示a的含义的命令行,那就是>> ,表示的就是按照a方式打开。

3、文件操作

3、1、C++的文件操作接口

1、操作文件,本质上就是进程在操作文件,进程和文件之间的关系
2、文件->磁盘->外设->硬件(所以向文件中写入,本质就是向硬件中写入)->但是用户没有权利直接向硬件写入->OS是硬件的管理者->所以要通过OS来写入->OS必须给我们提供系统调用(OS不相信任何人)->但是我们能够通过这些的函数fopen/fclose/fwrite/fread/fprintf/scanf/printf/cin/cout对硬件进行操作 ->所以我们使用的C/C++/…都是对系统调用接口的封装。
上面介绍了C语言的对于文件的操作,下面简单看一下C++对于文件的操作。
在这里插入图片描述
在这里插入图片描述
所以能看的出来,各种语言进行访问文件都有些不一样,难道每次都要记住不同语言的对于文件操作的函数吗?

3、2、认识系统调用接口

在这里插入图片描述
其中的pathname可以带路径,也可以带文件名。如果只是文件名的话,就在当前的路径下创建文件。
其中flag是一个整数,代表的是,我们想怎么样的操作文件。
open函数的第一种方式代表的通常都是操作一些已经存在的文件,因为如果直接创建的话,在Linux操作系统中,我们不知道,我们创建的文件的权限是什么,所以说有的时候还会让我们创建的文件的权限出现乱码的情况。
在这里插入图片描述
出现了我们不知道的权限T。
当然即使是使用第二种的open直接设置我们文件的权限的值了,最后看我们创建的文件的属性也还是不对。 那是因为还有umask的存在,会让我们的文件最后的权限有点区别。之前文章中介绍过,如果忘记了,可以回去看看,这里介绍了掩码的概念。
所以那我们能不能在程序中动态的规划掩码的值呢?
可以!我们能够通过系统调用来实现。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时一个简单的系统调用实现的文件操作就完成了。但是应该还有疑问,困惑为什么open传参的是整数,却传了O_WRONLY | O_CREAT呢?还有这两个是什么东西呢?
那是因为,在这地方的文件的操作方法有很多的组合方式,我们不确定每一使用的是什么,那么难道说,就要每一种方法都写出来一种函数吗?不能!所以根据操作方式最多也就传一传0,1,2…等等之类的,也不对太多,所以说一个整数的32位置,也就能够配合的很好的来解释操作方法。我们能够通过 | 操作,将32位的每一位都能够代表一种操作方式,这样能够节省大量的代码冗余问题。 类似于位图的使用?—OS设计中很多系统调用接口的常见方法(很重要,会实现,并加深理解)。并且其中的两个在这里的大写的英文字母表示的是。所以为了更方便的理解设计可以直接稍微手撕一个传递位图标记位的函数来方便我们的理解。
在这里插入图片描述
在这里插入图片描述
这样我们在传参的时候,就不需要多个的int来写,直接这样就能多个数传参。
如果只是想上面代码中利用open的参数的话,此时在文件中写东西的时候不会每次重写都要刷新文件,只会继续在前面追加后来写的内容。如果想要每次写的时候都全部刷新一遍的话,就需要再加上一个操作。
在这里插入图片描述
这样就完成了,写方式打开,不存在就创建,存在就在写之前都要先清—相当于是C语言中的fopen的“w”操作。
当然了,这么多的操作的方法,其中肯定也有类似于像是“r”的操作,就比如说是O_APPEDND。
在这里插入图片描述
只需要改变这一行中的一点,就能够实现在文件末尾直接添加。

3、2、强化对fd文件描述符及周边知识的理解

上面已经有了两个问题了,分别是对文件的写和追加问题,系统与语言层面的关系到底是什么。
现在还有一个问题就是open的返回值问题
我们可以通过程序来帮助我们来判断返回值是什么。
在这里插入图片描述
在这里插入图片描述
可是我们函数的返回值为什么是从3开始的呢?
那是因为文件操作的前面的0,1,2,已经有了它们的含义。
在这里插入图片描述
0:代表的是标准输入 键盘
1:代表的是标准输出 显示器
2:代表的是标准错误 显示器
这三个是默认打开的并且我们看到这三个都还和文件指针是一个样子的。
所以系统调用的open返回值和语言层面的stdin,stdout,stderr之间是不是也存在着关系?
这个问题的突破口就是,当我们打印open的返回值的时候,第一个就是3,此时,并不是代表前面的没有反而是一直存在的,那么我们write的函数不也能直接向2里面打印,看看是不是显示在显示器上,不就能够证明之间确实存在关系。
在这里插入图片描述
在这里插入图片描述
所以之前的0,1,2,不仅仅是表示的数字,也表示的标准输入/输出/错误。
虽然他不仅仅表示数字,但是我们怎么样做到,能够向数字来作为根据,打开一个文件,然后对文件开始操作呢?
所以问题就是文件描述符号fd,fd的本质是什么?
在这里插入图片描述
其中文件内核级别的缓存存储的是文件的数据,结构体struct file存储的是文件的属性。
本质表示的是内核进程中的文件映射关系的数组的下标。
无论读写文件,都需要再合适的时候让OS把文件的内容加载到文件缓冲区中
open是在做什么?
1、创建file 2、开辟文件缓冲区的空间,加载文件数据 3、查进程的文件描述表 4、file地址填入对应的表小表中 5、返回下标
话又说回来,其实read和write函数本质上也就是拷贝函数。
由于Linux操作系统一切皆文件,所以其中显示器,键盘的外设,也能够存在于sturct file链表中,所以就有了之前的0,1,2。
对于硬件来说的一切皆文件示意图。
在这里插入图片描述
这样的话,我们在OS层面再向上看的时候,就不再需要关注每一个硬件之间的差异了。所以一切皆文件了。所以我们刚刚的struct files_struct列表中才会有0,1,2的属于硬件的位置。
其中的struct file不管是对于文件也好,硬件也罢,这也相当于是在C++中的多态。

相关文章:

【Linux】基础IO认知

文件 1、回顾C语言中的文件接口2、对文件的理解(阶段一)3、文件操作3、1、C的文件操作接口3、2、认识系统调用接口3、2、强化对fd文件描述符及周边知识的理解 1、回顾C语言中的文件接口 事实上,我们在C语言的学习中了解的文件并不是真正的文件。从语言角度来说&…...

7. Kubernetes核心资源之Service服务实战

**service分类 : ** **ClusterIP : ** 默认类型,自动分配一个【仅集群内部】可以访问的虚拟IP **NodePort : ** 对外访问应用使用,在ClusterIP基础上为Service在每台机器上绑定一个端口,就可以通过: ipNodePort来访问该服务 **LoadBalanc…...

《向量数据库指南》——企业采用非结构化数据的场景及其深远影响

引言 在当今数字化转型的浪潮中,企业数据的种类与规模正以前所未有的速度增长,其中非结构化数据作为信息时代的重要组成部分,其价值日益凸显。Lynn提出的关于企业最先采用非结构化数据的观察,引发了我们对这一领域深入探索的兴趣。Charles的见解则为我们揭示了非结构化数据…...

Linux内核编程(十二)热插拔

本文目录 一、知识点1. 热插拔概念2. 热插拔机制3. Netlink机制 二、内核发送uevent事件到用户空间1. kobject发送uevent事件2. udevadm命令查看★示例代码:★优化:完善kset_uevent_ops(热插拔事件结构体) 三、用户空间使用Netlin…...

七夕警示:探索社工库与网络搜索下的个人隐私泄露与保护策略

随着七夕节的脚步日益临近,空气中弥漫着浪漫与温馨的气息。这个充满爱意的节日,我们沉浸在与心爱之人共享甜蜜时光的同时,不应忽视网络安全和个人隐私保护的重要性。在数字化时代,个人信息泄露的风险无处不在,如何在享…...

Redis-哨兵监控(sentinel)

是什么 Docs 吹哨人巡查监控后台master主机是否故障,如果故障了根据投票数自动将某一个从库转换为新主库,继续对外服务 作用:无人值守运维 能干嘛 1.主从监控 监控主从redis的库是否运行正常 2.消息通知 哨兵可以将故障转移的结果发送给客户端 3.…...

RISC-V反汇编调试记录分享

RISC-V反汇编调试记录分享 本文记录一次使用反汇编进行调试分析。 最近在 rtthread 下适配 MilkV Duo 的硬件定时器驱动时遇到了一些问题,demo 运行时报以下错误: Unhandled Exception 2:Illegal Instruction scause:0x0x0000000000000002,stval:0x0x…...

python上下文管理器 with的使用

python上下文管理器 with是从Python一个语法糖,它是一种上下文管理协议,目的在于把我们之前常见一个开发 try,except 和finally 关键字和一些文件开关闭合资源分配释放等问题都简化。 总结起来使用python 提供的with主要的作用是: 实现自动…...

24/8/8算法笔记 决策树构建鸢尾花

决策树是一种由算法自动设计的模型。在机器学习中,构建决策树的过程通常遵循以下步骤: 特征选择:算法会评估每个特征,并选择一个特征作为节点分裂的依据。这个选择基于某种准则,如信息增益(ID3算法&#xf…...

数据库扩展新篇章:主流分库分表中间件全解析

摘要: 随着企业数据量的激增,传统的单体数据库架构已经无法满足日益增长的性能需求和数据管理复杂性。分库分表技术作为解决这一问题的有效手段,通过将数据水平或垂直地分散到多个数据库中,提高了系统的扩展性和处理能力。本文将详…...

python看图片猜价格游戏,frame 和PhotoImage的使用

import tkinter.messagebox import tkinter import randomwindow tkinter.Tk()window.geometry(800x400)window.title(猜数字游戏)good_price random.randint(10, 100) input_price random.randint(1, 100)def sumit():global good_priceif entry.get() "" or en…...

未来展望:等保测评在网络安全领域的持续创新与发展

在数字化浪潮席卷全球的今天,网络安全已成为维护国家安全、社会稳定和经济发展的关键基石。作为网络安全保障体系的核心组成部分,等级保护测评(简称“等保测评”)在应对日益复杂多变的网络威胁中发挥着不可替代的作用。展望未来&a…...

构建深度学习驱动的多目标检测系统:YOLO模型及应用

随着计算机视觉技术的飞速发展,多目标检测在各种实际应用中发挥着越来越重要的作用。本文将j简单介绍如何构建一个基于深度学习的多目标检测系统,包括数据准备、模型训练、UI界面开发和部署的完整流程。如有部署的想法,想要(UI界面…...

算法刷题笔记 染色法判定二分图(染色法例题 C++实现)

文章目录 题目描述二分图介绍和基本思路实现代码(C) 题目描述 给定一个n个点m条边的无向图,图中可能存在重边和自环。请你判断这个图是否是二分图。 输入格式 第一行包含两个整数n和m。接下来m行,每行包含两个整数u和v&#xf…...

在Ubuntu上安装OpenBLAS和Eigen

安装 openblas 直接使用 apt-get 命令即可安装&#xff1a; sudo apt-get install libopenblas-dev检查是否安装成功&#xff0c;可以用下面的示例代码 example.cpp&#xff1a; #include <stdio.h> #include <stdlib.h> #include "cblas.h"int main(…...

Vue前端面试基础(一)

Vue面试题目详解可以涵盖多个方面&#xff0c;从基础知识到高级特性&#xff0c;再到实际应用和性能优化等。以下是一些常见的Vue面试题目及其详解&#xff1a; 1. Vue双向绑定原理 详解&#xff1a; Vue的双向绑定原理是通过数据劫持结合发布者-订阅者模式实现的。Vue在内部…...

使用Gitlab实现monorepo多项目CICD

CI/CD是什么 CI/CD&#xff08;Continuous Intergration/Continuous Delpoy&#xff09;&#xff0c;即持续集成/持续部署&#xff0c;或称为持续集成/持续交付&#xff0c;作为一套面向开发和运维团队的解决方案&#xff0c;CI/CD 主要解决集成新代码和向用户频繁交付应用的问…...

设计模式实战:银行账户管理系统的设计与实现

问题描述 设计一个银行账户管理系统,支持不同类型的账户(如储蓄账户、支票账户)进行存取款操作,并能够在账户余额发生变化时通知相关观察者(如用户、银行系统)。系统需要确保账户操作的灵活性和可扩展性。 设计分析 策略模式 策略模式定义了一系列算法,并将每个算法…...

⭕️【论文阅读】《Interactive Class-Agnostic Object Counting》

[2309.05277] Interactive Class-Agnostic Object Counting (arxiv.org) code&#xff1a; cvlab-stonybrook/ICACount: [ICCV23] Official Pytorch Implementation of Interactive Class-Agnostic Object Counting (github.com) 目录 Abstract Abstract 我们提出了一个新…...

高效的编程学习方法和技巧

编程小白如何成为大神&#xff1f;大学新生的最佳入门攻略 编程已成为当代大学生的必备技能&#xff0c;但面对众多编程语言和学习资源&#xff0c;新生们常常感到迷茫。如何选择适合自己的编程语言&#xff1f;如何制定有效的学习计划&#xff1f;如何避免常见的学习陷阱&…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎&#xff08;Physics Engine&#xff09; 物理引擎 是一种通过计算机模拟物理规律&#xff08;如力学、碰撞、重力、流体动力学等&#xff09;的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互&#xff0c;广泛应用于 游戏开发、动画制作、虚…...

postgresql|数据库|只读用户的创建和删除(备忘)

CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

springboot整合VUE之在线教育管理系统简介

可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生&#xff0c;小白用户&#xff0c;想学习知识的 有点基础&#xff0c;想要通过项…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...