【linux】基础IO(一)

文件只有站在系统层面才能彻底理解

简单回顾一下文件:

首先我们要明确一点,我们说的打开文件不是写下fopen就打开文件,而是当我们的进程运行起来,进程打开的文件。

我们在C语言一般都会使用过如下的代码进行向文件中写入在这里插入图片描述
但是除了此方法我们还有重定向也可以向文件中写入。
重定向的性质

  • 当没有文件时创建文件,有文件时清空文件
  • 将原本向一个文件输出的数据转移到另一个文件
    在这里插入图片描述

同样,我们也可以使用"a"追加重定向进行追加
在这里插入图片描述
在这里插入图片描述
故我们由此可以得出一个结论:重定向一定是与文件操作有关的。

提炼一下对文件的理解:

我们已经说过,是进程在打开文件,那么文件没有被打开的时候,文件在哪里?
答案是在磁盘中。

我们的一个进程可以打开多个文件,同时我们也可以同时运行多个进程。那么OS是不是要将进程进行管理呢?
答案是一定的,我们要用到先描述在组织的思想进行管理
于是我们可以预测一波,OS内部一定有类似PCB的内核数据结构

那么此时我们有个疑问?
每种语言对文件的操作都不一样,这样我们的学习成本岂不是大大增加了吗,为什么要这样做呢?

理解文件:

a. 操作文件,本质是进程在操作文件。
b. 文件->磁盘->外设->硬件->向文件中写入,向硬件中写入->OS是硬件的管理者->我们通过OS进行文件写入->我们不能直接向操作系统写入(操作系统必须确保硬件的良好运行防止数据被污染)->操作系统提供系统调用函数->我们使用C语言的fprintf,fread…是对系统调用的封装。

那么问题来了,我们为什么要使用系统调用呢?
怎么使用呢?(这个先不提)

使用系统调用函数:

既然是对系统调用的封装,那我们先看看系统调用的代码&&现象:
在此之前我们贴一下需要用到的系统调用函数。

打开文件:
在这里插入图片描述
关闭文件:
在这里插入图片描述
写入:
在这里插入图片描述


代码实践:

在这里插入图片描述
第二个的第一个参数为三个,先来解释一下这三个的含义,
不存在就创建,只写入,重新打开会清空。

现象:
在这里插入图片描述
于是现在我们有两个疑问:

  1. 0666是什么
  2. O_CREAT …是什么

对于1,我们在上图已经展示过open有两个形式,虽然像重载但不是重载!
第一个open一般是针对已经创建好的文件,第二个是还没有创造的文件。
0666就代表当前文件的权限。

那么我们的文件就应该是rw_rw_rw在这里插入图片描述
但是却不是,这是由于我们的mask值在作祟,我们设置的权限会与mask值做一系列操作变成图示权限。

我们也可以更改mask。在这里插入图片描述

在这里插入图片描述
对于第二个问题,这其实是OS系统调用接口的一种常见的方法,这个方法叫做位图,我们的一个int是有32的比特位的,故我们可以利用位操作来进行控制32个比特位。

具体看如下代码,宏应该用大写!!我太懒就没改了,要大写!在这里插入图片描述
在这里插入图片描述

于是我们就大概的了解了这些函数参数的意义。
此时我们也发现一个事情:
就是我们上图的系统调用与C语言的fopen的"w"很相似,他们有什么联系呢?

同时,我们将O_TRUNC换为O_APPEND即可得到与fopen的"a"很相似,那么他们又有什么关系呢?

另外,我们经过程序验证,在这里插入图片描述
在这里插入图片描述
发现没有0 1 2,这三个是什么文件呢?
答案是在这里插入图片描述
这是不是也与我们C语言默认就有的三个流一样呢?
这三者到底有什么关系ne?

在这之前,我们还要有两个东西要理解:
fd一切皆文件

fd的理解:

fd是每个文件都会有的唯一标识符。

我们已经说过,OS对于文件的管理一定也会有内核数据结构的存在。

在这里插入图片描述
图示并不完整,struct file还指向一块缓冲区与方法表(方法表等会会提到)

那么看完上图后,fd是啥我们依旧不知道呀。

当我们向一个文件写入时,当前进程会根据你穿给write的下标找到文件描述符表对应的下标,找到对应的struct_file对应的缓冲区写入,没错,文件描述表的下标记就是fd!!

一切皆文件:

我们fd的0 1 2是默认打开的,为什么可以把硬件当做文件打开呢?

一切皆文件这个概念如何理解呢?
接下来我们一起探究一下。

在这里插入图片描述
于是,在linux下一切接文件!!

解决上边的三个问题:

我们在访问文件时,OS只认fd,所以,FILE内部一定有fd,一定是对系统调用的封装。
在这里插入图片描述
现象:
在这里插入图片描述
C语言中的标准输入(stdin)、标准输出(stdout)和标准错误(stderr)本质上是对进程默认打开的文件描述符的封装。

为什么要封装呢?

为了语言的跨平台性!

linux,windows,macos等等操作系统的文件操作的系统调用的接口必然是不一样的,若我们使用系统调用,就会失去语言的跨平台性!

所以所有的语言都想有跨平台性,所以必须封装->不同语言封装的接口就会出现差别了。


欲知后事如何,请看下回分解~~

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

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

相关文章

GUID测试程序

全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符。GUID主要用于在拥有多个节点、多台计算机的网络或系统中。在理想情况下,任何计算机和计算机集群都不会生成两个相同的GUID。G…

Clickhouse-表引擎探索之MergeTree

引言 前文曾说过,Clickhouse是一个强大的数据库Clickhouse-一个潜力无限的大数据分析数据库系统 其中一个强大的点就在于支持各类表引擎以用于不同的业务场景。 MergeTree MergeTree系列的引擎被设计用于插入极大量的数据到一张表当中。数据可以以数据片段的形式一…

手写SpringBoot(二)之动态切换Servlet容器

系列文章目录 手写SpringBoot(一)之简易版SpringBoot 手写SpringBoot(二)之动态切换Servlet容器 手写SpringBoot(三)之自动配置 手写SpringBoot(四)之bean动态加载 手写SpringBoot&…

衍生品交易概况

场内 场外 交易台架构 报价、交易、研究、程序个股、股指Flow、Exotic线性、非线性 对冲管理 管理风险敞口 做好情景分析 尊重市场选择 及时调整策略 理解头寸 善于学习 场外衍生品交易员的一天 盘前 回顾市场、决定今天总体方向处理隔夜敞口 盘中 处理客户询价…

C语言中入门到实战————动态内存管理

目录 前言 一、为什么要有动态内存分配 二、 malloc和free 2.1 malloc 2.2 free 三、calloc和realloc 3.1 calloc 3.2 realloc 四. 常见的动态内存的错误 4.1 对NULL指针的解引用操作 4.2 对动态开辟空间的越界访问 4.3 对非动态开辟内存使用free释放 4.4 使…

【算法】01背包问题(代码+详解+练习题)

题目: 有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。 第 i 件物品的体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整…

视频素材库有哪些网站?八大平台视频素材库创作推荐

视频创作的小达人们,是不是经常在想,视频素材库有哪些网站能提供高质量的素材呢?别担心,今天我要为你们揭秘八个超棒的视频素材网站,让你的视频制作更加轻松在创作的路上如鱼得水! 蛙学网:海量…

深入探索Yarn:安装与使用指南

Yarn 是一个由 Facebook 开发的 JavaScript 包管理器,旨在提供更快、更可靠的包管理体验。它与 npm 类似,但在某些方面更加高效和可靠。本文将介绍如何安装 Yarn,并展示如何使用它来管理 JavaScript 项目的依赖。 1. 安装 Yarn Yarn 可以通…

三步提升IEDA下载速度——修改IDEA中镜像地址

找到IDEA的本地安装地址 D:\tool\IntelliJ IDEA 2022.2.4\plugins\maven\lib\maven3\conf 搜索阿里云maven仓库 复制https://developer.aliyun.com/mvn/guide中红框部分代码 这里也是一样的&#xff1a; <mirror><id>aliyunmaven</id><mirrorOf>*&…

【c++初阶】类与对象(下)

✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ &#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1f33f;&#x1…

ESP32学习---ESP-NOW

ESP32学习---ESP-NOW 基于Arduino IDE环境获取mac地址单播通讯一对多通讯多对一通讯多对多通讯模块1代码模块2模块3 广播通讯 基于ESP-IDF框架 乐鑫编程指南中关于ESP-NOW的介绍&#xff1a;https://docs.espressif.com/projects/esp-idf/zh_CN/v5.2.1/esp32/api-reference/net…

7.1 Mysql shell 定时备份

直接上脚本----linu 定时任务执行 #!/bin/bash# 配置信息 DB_USER"your_username" # 数据库用户名 DB_PASSWORD"your_password" # 数据库密码 DB_NAME"your_database_name" # 要备份的数据库名 BACKUP_DIR"/path/to/backup/directory"…

如何在Ubuntu系统部署Z-blog博客结合cpolar实现无公网IP访问本地网站

文章目录 1. 前言2. Z-blog网站搭建2.1 XAMPP环境设置2.2 Z-blog安装2.3 Z-blog网页测试2.4 Cpolar安装和注册 3. 本地网页发布3.1. Cpolar云端设置3.2 Cpolar本地设置 4. 公网访问测试5. 结语 1. 前言 想要成为一个合格的技术宅或程序员&#xff0c;自己搭建网站制作网页是绕…

CrossOver玩游戏会损害电脑吗 CrossOver玩游戏会卡吗 Mac玩游戏 crossover24免费激活

CrossOver是一款可以在macOS上运行Windows应用程序的软件&#xff0c;它利用了Wine技术&#xff0c;无需安装虚拟机或双系统&#xff0c;可以直接在苹果系统下运行Windows游戏。那么&#xff0c;使用CrossOver玩游戏会损害电脑吗&#xff1f;CrossOver玩游戏会卡吗&#xff1f;…

LLaMA-Factory参数的解答

打开LLaMA-Factory的web页面会有一堆参数 &#xff0c;但不知道怎么选&#xff0c;选哪个&#xff0c;这个文章详细解读一下&#xff0c;每个参数到底是什么含义这是个人写的参数解读&#xff0c;我并非该领域的人如果那个大佬看到有参数不对请反馈一下&#xff0c;或者有补充的…

【Entity Framework】EF中的增删改查

【Entity Framework】EF中的增删改查 文章目录 【Entity Framework】EF中的增删改查一、概述二、DbContext数据上下文三、EntityState五个状态值四、EF添加数据4.1 EF Add方式4.2 EF 通过改变对象的状态为 Added4.3 调用方sql4.4 调用存储过程 五、EF修改数据5.1 不查询数据库&…

项目管理系统在制造业的应用,提高生产效率的秘诀与解决方案

缩短产品交货周期&#xff0c;提高产品交付率是当下很多制造业面临的难题&#xff0c;项目管理系统业务流程自动化&#xff0c;能够显著改善项目效率。接下来我们说一说项目管理系统在制造业的应用&#xff0c;项目管理系统制造业解决方案。 制造业典型的项目背景 随着企业体量…

学习【Redis原理篇】这一篇就够了

目录 1. 数据结构1-1. 动态字符串&#xff08;SDS&#xff09;1-2. intset1-3. Dict 2. 网络模型3. 通信协议4. 内存策略 1. 数据结构 1-1. 动态字符串&#xff08;SDS&#xff09; 我们都知道Redis中保存的Key是字符串&#xff0c;value往往是字符串或者字符串的集合。可见字…

【Java项目】基于SpringBoot的【就业信息管理系统】

在当今这个科技迅猛发展的时代&#xff0c;计算机技术在生活中扮演着至关重要的角色&#xff0c;特别是在信息管理领域。在这样的背景下&#xff0c;学习计算机知识不只是简单地掌握一项技能&#xff0c;更关键的是将所学知识应用于实际&#xff0c;以创新的思维不断简化人们的…

on-my-zsh 命令自动补全插件 zsh-autosuggestions 安装和配置

首先 Oh My Zsh 是什么? Oh My Zsh 是一款社区驱动的命令行工具&#xff0c;正如它的主页上说的&#xff0c;Oh My Zsh 是一种生活方式。它基于 zsh 命令行&#xff0c;提供了主题配置&#xff0c;插件机制&#xff0c;已经内置的便捷操作。给我们一种全新的方式使用命令行。…