【lesson35】基础IO之fd周边问题

文章目录

  • 基础IO要讲的知识点介绍
  • fd周边问题

基础IO要讲的知识点介绍

1.复习一下C语言的接口
2.直接使用系统接口
3.分析系统接口的细节,引入fd(文件描述符)
4.fd的周边问题(fd的理解、fd和file的关系、fd分配规则、fd重定向…)

fd周边问题

我们前面学了fd,那么fd到底是什么?
进行访问文件必须先打开文件,那么一个进程可以打开多个文件吗?可以的!
一般而言进程 : 打开的文件 = 1 : n的关系
文件要被访问,前提是加载到内存中,才能被直接访问!

因为进程 : 打开的文件 = 1 : n的关系,那么如果多个进程都打开自己的文件呢?
系统中就会存在大量被打开的文件!
所以OS要不要把如此多的打开文件管理起来?要
如何管理?先描述,再组织!

在内核中如何看待打开的文件?
OS内部为了管理每一个被打开的文件,所以为每个打开的文件构建了struct file。
在这里插入图片描述
创建struct file的对象充当被打开的文件,如果有很多呢?
再用双链表组织起来

进程和文件的对应关系如下图:
在这里插入图片描述
再具体点
在这里插入图片描述

所以fd本质就是一个数组的下标的。

文件分两类:
1.被打开的文件(内存文件)
2.没有被打开的文件(磁盘文件)

而现在知道,文件描述符就是从0开始的小整数。当我们打开文件时,操作系统在内存中要创建相应的数据结构来描述目标文件。于是就有了file结构体。表示一个已经打开的文件对象。而进程执行open系统调用,所以必须让进程和文件关联起来。**每个进程都有一个指针*files, 指向一张表files_struct,该表最重要的部分就是包涵一个指针数组,每个元素都是一个指向打开文件的指针!**所以,本质上,文件描述符就是该数组的下标。所以,只要拿着文件描述符,就可以找到对应的文件。
在这里插入图片描述
fopen和fwrite的底层调用逻辑
fopen->open->fd(用fd封装FILE文件)->FILE->*FILE**(返回给)->fopen

fwrite->FILE*->fd->write->write(fd,.....)->进程自己执行OS内部的write方法->能找到进程的task_struct->*files->file_struct->fd_array[fd]->struct_file->内存文件被找到->开始操作

理解了什么是fd接下来就要知道fd的分配规则到底是什么。
在这里插入图片描述
在这里插入图片描述
我们看到关闭0号文件,它占用的就是0号描述符。
所以fd的分配规则:最小的,没有被占用的文件描述符

输出重定向
在这里插入图片描述
运行结果
在这里插入图片描述
我们内容确实达到显示器上了,但是如果我们关闭1,显示器也就关闭了,这内容会打向哪里呢?
在这里插入图片描述
在这里插入图片描述
我们看到内容确实没打到显示器上。
那么打印到了哪里呢?
在这里插入图片描述
打印到了log.txt中,这就是输出重定向。
原理:
在这里插入图片描述

而接下来向1中写的内容不会写到stdout中只会写到log.txt中,这就是重定向的原理。
重定向本质:在OS内更改fd对应的内容指向!

输入重定向的演示:

 #include <stdio.h>2 #include <string.h>3 #include <unistd.h>4 #include <sys/types.h>5 #include <sys/stat.h>6 #include <fcntl.h>7 8 int main()9 {10   //默认打开0 1 2 关闭0号文件描述符11   close(0);12   int fd = open("log.txt",O_RDONLY,0666);13   if(fd < 0)14   {15     perror("open");16   }17   else18   {19     char buffer[64];20     while(fgets(buffer,sizeof(buffer),stdin) != NULL)21     {22 23       fprintf(stdout,buffer,NULL);                                                                                                                                  24     }close(fd);39   }40   return 0;41 }

运行代码
在这里插入图片描述
我们看到本来应该从stdin读取的内容变成从log.txt里面读取。

追加重定向:
我们只要把输出重定向的O_TRUNC改成O_APPEND即可。
这里大家自己更加,我便不演示了。
在这里插入图片描述

我们之前都是自己手动关闭0,1的,这样太挫了,下面就有个函数帮助我们。
在这里插入图片描述
在这里插入图片描述
问题:
dup2拷贝是在拷贝什么?拷贝的是文件描述符数组里面的指针。
谁是谁的拷贝?
是把new拷给old?
还是把old拷给new?

看英文可知是把:oldfd拷贝给newfd。所以最后newfd里面的指针和oldfd一样
理解:

在这里插入图片描述
输出重定向更改
在这里插入图片描述
运行代码
在这里插入图片描述

追加重定向更改
在这里插入图片描述
运行代码
在这里插入图片描述
输入重定向这里就不更改了,逻辑一样大家自行更改即可。

如何理解一切皆文件呢?->Linux的设计哲学->体现在OS的软件设计层面!

LinuxC语言写的!如何用C语言实现面向对象,甚至是运行时多态呢?->struct类但是我们知道struct类是没有成员函数的那么如何实现呢?函数指针

在这里插入图片描述
底层不同的硬件,一定对应的是不同的操作方法!但是上面的设备都是外设,所以每一个设备都核心访问函数都可以是read,write的I/O操作。
所有设备都可以有自己的read和write,但是代码的实现一定是不一样的。
在这里插入图片描述

在这里插入图片描述
所以在struct file的这层往上就没有任何硬件的区别了
看待所有文件的方式,都统一成为了struct file->所以就有了Linux下一切皆文件的说法。

接下来就是缓冲区的理解
1.什么是缓冲区?就是一段内存空间
(这个空间谁提供?用户?语言?OS?)
2.为什么要有缓冲区?

故事
小明在云南大学想给远在北京邮电的小华送一些书过去。
送书有2种方法:
1.自己骑车送过去(写透模式(WT) 成本高,花时间多,慢)
2.快递发送点
在这里插入图片描述
这是写回模式(WB) 成本低,花时间少,快

那么顺丰是立马发送吗?
不是,是快递累积到一定数量后再发送

在这个故事里的顺丰就是典型的缓冲区的意义:目的是体改整机的效率

类比:
顺丰:缓冲区
小明:用户
小华:磁盘
书: 数据

缓冲区主要是为了提高用户的响应速度。

缓冲区刷新策略
顺丰发送策略对应缓冲区的刷新策略:
1.立即发送(立即刷新)
2.架子上的快递一行一行发送的行发送(行缓冲)
3.快递架子满了在发送(全缓冲)

特殊情况
1.用户强制刷新(fflush)
2.进程退出

缓冲策略 = 一般加特殊

那么缓冲区到底谁提供的?
C?OS?

写一段代码:
在这里插入图片描述
运行代码
在这里插入图片描述
我们发现把内容打印到stdout的内容重定向到log.txt中,log.txt中
C语言提供的接口打印了两次
OS提供的接口打印了一次
接来下我们把fork注释掉看一下,运行结果
在这里插入图片描述
在这里插入图片描述
这里说明一个问题,这个现象绝对个fork有关
那么为什么OS提供的接口打印一次,C提供的接口打印两次下次再说。

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

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

相关文章

【数据结构】并查集(路径压缩)

文章目录 并查集1.朴素版本2.路径压缩3.按秩合并4.启发式合并5.练习题 并查集 1.朴素版本 1. 并查集解决的是连通块的问题&#xff0c;常见操作有&#xff0c;判断两个元素是否在同一个连通块当中&#xff0c;两个非同一连通块的元素合并到一个连通块当中。 并查集和堆的结构…

Unity 图片不改变比例适配屏幕

Unity 图片不改变比例适配屏幕 前言项目场景布置代码编写添加并设置脚本效果 前言 遇到一个要让图片适应相机大小&#xff0c;填满屏幕&#xff0c;但不改变图片比例的需求&#xff0c;记录一下。 项目 场景布置 代码编写 创建AdaptiveImageBackground脚本 using System.C…

ConcurrentModificationException异常原因,解决方法,线程安全的单例模式

异常简介 ConcurrentModificationException&#xff08;并发修改异常&#xff09;是基于java集合中的 快速失败&#xff08;fail-fast&#xff09; 机制产生的&#xff0c;在使用迭代器遍历一个集合对象时&#xff0c;如果遍历过程中对集合对象的内容进行了增删改&#xff0c;…

Fink CDC数据同步(二)MySQL数据同步

1 开启binlog日志 2 数据准备 use bigdata; drop table if exists user;CREATE TABLE user(id INTEGER NOT NULL AUTO_INCREMENT,name VARCHAR(20) NOT NULL DEFAULT ,birth VARCHAR(20) NOT NULL DEFAULT ,gender VARCHAR(10) NOT NULL DEFAULT ,PRIMARY KEY(id) ); ALTER TA…

刘知远团队大模型技术与交叉应用L6-基于大模型文本理解和生成介绍

介绍 NLP的下游运用可以分为&#xff1a;NLU(理解)和NLG(生成) 信息检索&#xff1a;NLU 文本生成&#xff1a;NLG 机器问答&#xff1a;NLUNLG 大模型在信息检索 大模型在机器问答 大模型在文本生成 信息检索-Information Retrieval (IR) 背景 谷歌搜索引擎目前同时集成了…

NLP入门系列—Attention 机制

NLP入门系列—Attention 机制 Attention 正在被越来越广泛的得到应用。尤其是 [BERT]火爆了之后。 Attention 到底有什么特别之处&#xff1f;他的原理和本质是什么&#xff1f;Attention都有哪些类型&#xff1f;本文将详细讲解Attention的方方面面。 Attention 的本质是什…

Mac M1使用PD虚拟机运行win10弹出“内部版本已过期立即安装新的windows内部版本”

一、问题 内部版本已过期立即安装新的windows内部版本 二、解决 1、如图所示打开zh-CN目录 C:\windows\system32\zh-CN找到licensingui.exe文件 将该文件重命名为licensingui_bak.exe 2、修改完成效果如下 &#xff08;1&#xff09;但操作中发现&#xff0c;需要TrustedIns…

闲的无聊,做了几个微信红包封面,才发现好像没啥用,索然无味

这几天闲的无聊&#xff0c;正好也快要过年了&#xff0c;心血来潮搞几个微信红包封面。 折腾了大半天&#xff0c;又是ps&#xff0c;又是开通微信红包封面平台。 弄了100多个图&#xff0c;选出来50个&#xff0c;最后就提交了1个到微信平台&#xff0c;也通过审核了。 最…

【Kafka】服务器Broker与Controller详解

这里写自定义目录标题 Broker概述Broker总体工作流程Broker重要参数 Controller为什么需要Controller具体作用数据服务Leader选举选举流程脑裂问题羊群效应触发leader选举 Broker 概述 Kafka服务实例&#xff0c;负责消息的持久化、中转等功能。一个独立的Kafka 服务器被就是…

vue2 对接 海康摄像头插件 (视频WEB插件 V1.5.2)

前言 海康视频插件v.1.5.2版本运行环境需要安装插件VideoWebPlugin.exe&#xff0c;对浏览器也有兼容性要求&#xff0c;具体看官方文档 对应下载插件 去海康官网下载插件 里面有dome等其他需要用到的 地址&#xff1a; 安装插件 打开下载的文件里的bin文件 安装一下Video…

修改Vim编辑器的缩进和显示行数

一、Vim编辑器的缩进和显示行数 1.指令 sudo vi /etc/vim/vimrc2.插入内容 set tabstop4 set shiftwidth4 set nu 注意输入的格式&#xff0c;前后不要留空格 tabstop是输入按下tab缩进4个 shiftwidth是批量缩进4个 nu是显示行数

革命性的写作:MDX 让你的 Markdown 全面动起来

1. MDX MDX 是一种标记语法&#xff0c;它结合了 Markdown&#xff08;一种流行的文本到 HTML 的转换工具&#xff09;和 JSX&#xff08;React 中用于描述 UI 组件的语法扩展&#xff09;。MDX 允许你在 Markdown 文档中直接写入 JSX&#xff0c;这意味着你可以在 Markdown 内…

IPv6协议讲解

IPv6协议讲解 IPv6是互联网协议的第六版(Internet Protocol Version 6)&#xff0c;它用于在互联网上路由数据包&#xff0c;旨在替代IPv4&#xff0c;它提供了更多的IP地址和改进的网络功能。IPv6是为了应对互联网快速发展带来的挑战而设计的&#xff0c;它的引入不仅解决了地…

【教学类-40-08】A4骰子纸模制作8.0(2.97CM嵌套骰子表格相连 一页7个 油墨打印A4铅画纸)

作品展示&#xff08;一页7个骰子&#xff0c;表格连在一起&#xff0c;一行一个&#xff08;2嵌套&#xff09;&#xff09; 背景需求&#xff1a; 制作三嵌套盒子并实践后&#xff0c;感觉套起来很紧&#xff0c;还是用2嵌套的铅画纸做骰子比较好&#xff0c; https://blog…

代码随想录算法训练营|day24

第七章 回溯算法 77.组合代码随想录文章详解总结 77.组合 以n5,k3为例 (1)for循环遍历&#xff0c;递归选择符合要求的值加入path&#xff0c;len(path)k时&#xff0c;返回 statrtIndex保证每次递归取到的值不重复 剪枝&#xff1a;i<n-(k-len(path))1 后续需要k-len(pat…

政安晨的AI笔记——示例演绎OpenAI的ChatGPT与DALL·E提示词总原则(并融合创作一副敦煌飞天仙女图)

ChatGPT是由OpenAI开发的一种基于大规模预训练的语言生成模型。它建立在GPT&#xff08;Generative Pre-trained Transformer&#xff09;模型的基础上&#xff0c;通过大量的无监督学习和生成式任务训练来学习语言的概念和模式。 ChatGPT的原理是基于Transformer模型。Transfo…

shell命令以及运行原理 | 权限

Shell命令原理剖析 shell命令以及运行原理&#x1f4a6;Linux权限的概念&#x1f4a6;什么是权限❔Linux下有哪些权限身份❔Linux中文件属性解析 shell命令以及运行原理&#x1f4a6; Linux严格意义上说的是一个操作系统&#xff0c;我们称之为 “核心&#xff08;kernel"…

AS-V1000 视频监控平台产品介绍:客户端功能介绍(一)

目 录 一、引言 1.1 AS-V1000视频监控平台介绍 1.2平台服务器配置说明 二、软件概述 2.1 客户端软件用途 2.2 客户端功能 三、客户端功能说明 3.1 登陆和主界面 3.1.1登陆界面 3.1.2登陆操作 3.1.3主界面 3.1.4资源树 3.2 视频预览 3.2.1视频预览界面 3.2.…

京东微前端框架MicroApp简介

一、MicroApp 1.1 MicroApp简介 MicroApp是由京东前端团队推出的一款微前端框架,它从组件化的思维,基于类WebComponent进行微前端的渲染,旨在降低上手难度、提升工作效率。MicroApp无关技术栈,也不和业务绑定,可以用于任何前端框架。 官网链接:https://micro-zoe.gith…

获取真实 IP 地址(一):判断是否使用 CDN(附链接)

一、介绍 CDN&#xff0c;全称为内容分发网络&#xff08;Content Delivery Network&#xff09;&#xff0c;是一种网络架构&#xff0c;旨在提高用户对于网络上内容的访问速度和性能。CDN通过在全球各地部署分布式服务器节点来存储和分发静态和动态内容&#xff0c;从而减少…