【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.rhkb.cn/news/294030.html

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

相关文章

LLM应用:Prompt flow vs LangChain

背景 Prompt flow和LangChain都是LLM时代,为高效地构建LLM应用而生。 Prompt flow是Microsoft开源的,其诞生时,LangChain已经很有名气了。 所以作为后生的Prompt flow会为我们带来哪些新的东西呢? ​​​​​​​ Prompt flo…

互联网、因特网、万维网的区别

互联网 internet:凡是能彼此通信的设备组成的网络就叫互联网,即使只有两台计算机,无论以何种技术使其彼此通信,都叫互联网。所以,根据互联网的覆盖规模可以分为: 局域网(Local Area Network&am…

如何使用potplayer在公网环境访问内网群晖NAS中储存在webdav中的影视资源

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-D7WJh3JaNVrLcj2b {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

黑马鸿蒙笔记 3

目录 11.ArkUI组件-Column和Row 12.ArkUI组件-循环控制 13.ArkUI组件-List 14.ArkUI组件-自定义组件 15.ArkUI组件-状态管理State装饰器 16.ArkUI组件-状态管理-任务统计案例 17.ArkUI组件-状态管理-PropLinkProvideConsume 11.ArkUI组件-Column和Row Colum和Row的交叉…

第三天开始写了

现在的情况 写俩个接口信息 1. 一个修改 2. 一个 删除 发现了一个问题 只有这些参数无法完成修改的 因为这些关联到一个商品表和一个用户表,我们应该查询他们id信息,修改其中的内容,单独根据字符串查看效果可能不好 这里我们提交应该是用…

2024年抖音小店的保证金是多少?真的可以做0元保证金的店铺吗?

大家好,我是电商糖果 2024年想要入驻抖音小店的商家依旧很多,关于小店的保证金问题也有不少人前来咨询。 大家问的最多的是可以开通0元保证金的店铺吗?以及2024年抖音小店保证金是多少? 这里糖果给大家一个个解答。 可以开通0…

基于YOLOv8的绝缘子检测系统

💡💡💡本文摘要:基于YOLOv8的绝缘子小目标检测,阐述了整个数据制作和训练可视化过程 1.YOLOv8介绍 Ultralytics YOLOv8是Ultralytics公司开发的YOLO目标检测和图像分割模型的最新版本。YOLOv8是一种尖端的、最先进的&a…

k8s入门到实战(七)—— 回顾:使用yaml文件配置pv、pvc、configmap部署mysql服务

实战:部署 mysql 服务 回顾加深 pv、pvc、configmap 删除所有 deployment、pv、pvc、configmap、StorageClass创建一个 nsf 挂载目录给 mysql mkdir -p /nfs/data/mysql创建 yaml 文件mysql-server.yaml # 创建pv apiVersion: v1 kind: PersistentVolume metadat…

针对 qt的sqlite加密数据库sqlitecipher插件QtCipherSqlitePlugin

💂 个人主页:pp不会算法^ v ^ 🤟 版权: 本文由【pp不会算法v】原创、在CSDN首发、需要转载请联系博主 💬 如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连)和订阅专栏哦 文章目录 简介编译安装使用可视化工具查看完结 简介 在客户端存储…

字符指针、字符串、字符数组、字符串数组等

参考&#xff1a;https://xiefor100.blog.csdn.net/article/details/52667734 #include <stdio.h> #include <stdlib.h> #include <string.h> int main() {char s1[] "12345"; // "12345"在栈区&#xff0c;可以指针偏移读取和修改c…

stable diffusion如何下载预处理器?

如何下载预处理器&#xff1f; 具体位置:SD文件>extensions>sd-webui-controlnet>annotator” 把整个文件夹复制到SD的文件夹里面 里面有一个“downloads”文件夹 把这些模型复制到“downloads”文件夹里

【MATLAB第103期】#源码分享 | 基于MATLAB的LIME可解释性线性分类预测模型,2020b以上版本

【MATLAB第103期】#源码分享 | 基于MATLAB的LIME可解释性线性分类预测模型&#xff0c;2020b以上版本 一、模型介绍 LIME&#xff08;Local Interpretable Model-agnostic Explanations&#xff09;是一种用于解释复杂机器学习模型预测结果的算法。它由Marco Ribeiro、Sameer…

并发-开启新线程

目录 实现多线程的官方正确方法&#xff1a;2种 实现Runnable接口方式的实现原理 两种方法的对比 匿名内部类实现线程的两种方式 思考&#xff1a;同时用两种方法会怎么样 总结&#xff1a;最精准的描述 实现多线程的官方正确方法&#xff1a;2种 方法一&#xff1a;实现…

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别

Git、TortoiseGit、SVN、TortoiseSVN 的关系和区别 &#xff08;二&#xff09;Git&#xff08;分布式版本控制系统&#xff09;:&#xff08;二&#xff09;SVN&#xff08;集中式版本控制系统&#xff09;&#xff08;三&#xff09;TortoiseGit一、下载安装 git二、安装过程…

[Java基础揉碎]接口

目录 为什么有接口 基本介绍 接口的应用场景 注意事项和细节 接口和继承类的比较 总结 >接口和继承解决的问题不同 >接口比继承更加灵活 >接口在一定程度上实现代码解耦 接口的多态特性 多态参数 ​编辑 多态数组 多态传递 ​编辑 为什么有接口 usb插槽就是…

Educational Codeforces Round 163 (Rated for Div. 2) E. Clique Partition

题目 思路&#xff1a; #include <bits/stdc.h> using namespace std; #define int long long #define pb push_back #define fi first #define se second #define lson p << 1 #define rson p << 1 | 1 const int maxn 1e6 5, inf 1e9, maxm 4e4 5; co…

halcon图像腐蚀

1、原理 使用结构元素在图像上移动&#xff0c;只有结构元素上的所有像素点都属于图像中时&#xff0c;才保留结构元素中心点所在的像素&#xff0c;常用于分离连接的两个物体、消除噪声。 2、halcon代码 dev_open_file_dialog (read_image, default, default, Selection) r…

【Java八股面试系列】Arraylist和HashMap的底层原理

文章目录 ArrayList源码总&#xff1a;构造方法扩容机制remove HashMap总&#xff1a;构造方法细节问题putVal()方法resize()方法Hash值 HashMap常见问题 ConcurrentHashMap总&#xff1a;putVal()方法自己的测试 为什么重写HashCode和equals ArrayList源码 总&#xff1a; *…

C++template之类模版进一步了解

目录 一、类模板实例化 1.非类型模版参数 2.函数模板的特化 3.类模板特化 3.1全特化 3.2偏特化 3.2.1部分特化 3.2.2对参数进一步限制 二、注意事项 1.类模板的定义和声明要在同一个文件&#xff0c;不然容易出错 前言&#xff1a;这一篇是在我的上一篇文章的基础上&am…

网络安全接入认证-802.1X接入说明

介绍 802.1X是一个网络访问控制协议&#xff0c;它可以通过认证和授权来控制网络访问。它的基本原理是在网络交换机和认证服务器之间建立一个安全的通道&#xff0c;并要求客户端提供身份验证凭据。如果客户端提供的凭据是有效的&#xff0c;交换机将开启端口并允许访问。否则&…