linux Fd以及重定向讲解
感谢你的阅读,是对我最大的鼓励!!!!
目录
fd理解
文件操作重定向
让我们回顾C语言文件操作
首选我们要知道2个知识点:
额外知识点
如何理解一切皆文件呢?
当父进程fork创建子进程是否创建文件。
fd理解
在操作系统内核中,进程PCB还管理着一个结构体files_struct。这个结构体管理着,该进程打开的文件,一般情况下:进程:文件=1:n的比例,既然如此我们就需要将这多个文件管理起来。
文件加载到内存中,会形成一个叫做file的结构体。
同样的一个进程可以打开多个文件,这些打开的文件以某种数据结构,关联在一起。
而我们的进程中有个叫做files_struct 的结构体,他的里面有一个文件指针数组成员变量,每一个元素保存的都是对应文件的地址。
而我们的fd其实就是files_struct中数组下标数字。
文件操作就是,拿着fd数组下标,经过PCB中files_struct指针找到files_struct结构体,然后根据就是根据fd下标索引到数组中找到相应操作的文件地址,然后通过文件地址找到需要操作的file结构体。
文件操作重定向
让我们回顾C语言文件操作
//......
FILE*fp=fopen("./test.txt","w");
//......
fclose(fp);
看似平平无奇的一句话,现在来看,我们理解FILE*是指针,但是什么是FILE吗?为什么fp就可以操作文件了呢?提前close会怎么样呢?
记住,所有的语言其实都是在操作系统,系统语言上的接口,所以fopen、fclose其实只是在系统接口open、close上的封装。而FILE是一个结构体,那么理解fd的话,我们就立刻知道,FILE这个结构体中一定要包含一份数字,这个数字一定是为了在files_struct结构体的数组中寻找相关的文件下标。
FILE是C语言文件操作所需要的结构体,该结构体中一定有,一份数字为了操作在底层files_struct结构体中指针数组成员寻找相应的file结构体。
那么重定向是什么意思呢?
比如以下字符串
//C
FILE*fp=fopen("./test.txt","w");
printf("holle world\n");
该字符串原本经过printf函数要打印在显示屏上,经过了流重定向打印到了test.txt文件中。
这是个什么原理呢?
首选我们要知道2个知识点:
1、程序会默认打开标准输入、标准输出、标准错误的三个流、对应在C语言的就是stdin stdout stderr,这仨其实就是FILE*指针。
2、files_struct中的数组会顺序存储打开的文件,意思就是原本fd=0(标准输入)、1(标准输..出)、2(标准错误)、3(文件1)、4(文件2)...如果前一个文件关闭会清空files_struct 数组的数据,但是数组不会数据前移,再打开一个文件就会加载到该位置。
让我们来画图理解重定向的原理
下面是我们files_struct结构体中数组与file结构体的链接。
现在我们关闭file2(标准输出),将关闭键盘输入操作。没有打开新文件我们就会使下标1的内存就会被置空,不连接任何文件。
这个时候将一个文件载入到进程,在文件file结构体之间也会有着链接关系,新打开的文件会增到这个数据结构中。
操作系统会让打开文件的进程的内核数据结构files_struct的数组存储打开的文件存储在内存的地址,而我们存储的方式是按顺序低到高寻找是否有未被使用的低下标元素,这时候发现1下标空间未被使用,这时候就会存储该文件的地址,完成进程与打开文件的联系。
操作验证(关闭标准输出,然后打开文件,然后向stdout流写入文件)
关闭fd=1(标准输出)使用3个函数向标准输出打印字符串。
--------
首先查看log.txt无任何字符串
---------
运行程序,没有在屏幕打印数据
---------
字符串流向了log.txt中
这就是我们所谓的重定向。是不是很简单(简单个p)
额外知识点
如何理解一切皆文件呢?
其实这个概念是在打开的文件构成一个数据结构层面的概念。
我们的一切皆文件就是站在vfs层理解这句话的,为什么呢,由于每个硬件的读写操作都是不一样的,但是我们都要同一的管理起来,这个时候就见他们的操作方式的地址加载到file结构体中,每个结构体都有着不同硬件,软件,文件的读写方式,我们在vfs一视同仁的认为他们都在vfs层都是叫做文件。这就是我们一切皆文件的概念。
当父进程fork创建子进程是否创建文件。
不会的。子进程会有着独立的进程空间files_struct是父进程继承,但是文件是多个进程共享的,不会因为子进程的创建,而复制一份文件。
有一点子进程会继承父进程打开的文件地址,所以子进程也可以访问到和父进程相同的文件。如果父进程重定向了标准输入,标准输出等等映射关系,我们的子进程也会重定向。
因为子进程是父进程的拷贝,这属于一种深拷贝中的浅拷贝(可以浏览我另一篇文章:vector【实现】:迭代器失效以及非法的间接寻址、深拷贝中的浅拷贝。_云的小站的博客-CSDN博客)
感谢你的阅读,是对我最大的鼓励!!!!
fd的本质是内核当中进程和打开文件对应关系的数组的下标
如何理解一切皆文件呢?:文件在系统层面有一个vfs的虚拟文件系统当中会包含每一个被打开文件的结构体struct file ,这个结构体有一批函数指针,这批函数指针直接帮我们指向底层方法。所以在上层我们可以以同一的视角struct file的方式看待所有文件 所以一切皆文件是在vfs层的看待文件,而不是在硬件看待。
linux task_struct->files_struct->(vfs层)file(struct结构体)->驱动层
echo ”holle world“ > log.txt 就是echo的的fd:1 关闭然后再打开log.txt文件,完成了输出重定向
fd
当fork创建子进程时候进程数据会拷贝,但是文件数据不拷贝,所以子父进程的files_struct 都是指向相同的file结构体
如果父进程曾经改变了
file结构体中有一个 int cnt 引用计数 :当有一个进程指向该文件cnt++ 一个进程close该文件cnt-- 当cnt==0 文件退出内存释放空间
相关文章:

linux Fd以及重定向讲解
感谢你的阅读,是对我最大的鼓励!!!! 目录 fd理解 文件操作重定向 让我们回顾C语言文件操作 首选我们要知道2个知识点: 额外知识点 如何理解一切皆文件呢? 当父进程fork创建子进程是否创建…...
Moonbeam近日提案公投一览
正在跟进Moonbeam治理的小伙伴,一起来快速浏览一下近期生态中正在发生的事情吧!其中包含多个去中心化应用的Grant加速计划提案、HRMP开拓提案以及优化质押相关平台的内容。许多提案都与网络的运作息息相关,一起了解和参与Moonbeam的发展吧&am…...

凝聚青年力量,打造数字化人才队伍
当代青年人勇于探索、敢于创新、勤于变革,积极承担社会责任。这与ABeam倡导的「Build Beyond As One.™」的品牌理念不谋而合。ABeam的青年员工是未来社会的中坚力量,也正用他们的青春能量助力ABeam在中国的发展。 01 新兴青年力量 对ABeam而言&#…...

蓝牙资讯|智能家居标准Matter 1.1 发布,智能家居产品兼容更丰富
据“CSA 连接标准联盟”官方微信号,Matter 1.1 版本已发布,“1.1 版本带来的更新使设备制造商和开发者上手更容易、产品获取认证更方便,也让产品能更快地交付给用户。该版本还为电池供电设备提供了更大支持,而这类设备涉及多种类型…...

Cube Map 系列之:手把手教你 实现天空盒(Sky Box)
什么是天空盒 An skybox is a box with textures on it to look like the sky in all directions or rather to look like what is very far away including the horizon.天空盒是一个使用纹理贴图构建的盒子,人在其中朝任何一个方向看去,其纹理彷佛天空…...

腾讯VS百度:在AI上下大赌注
来源:猛兽财经 作者:猛兽财经 腾讯控股(00700)最近已经把基础模型和生成式人工智能应用方面的行业突破视为其业务的新增长机会了,并且正在大力投资人工智能,从而增强其现有产品的竞争力和拓展新的机会,比如腾讯已经把…...

字节原来这么容易进,是面试官放水,还是公司实在是太缺人?
本人211非科班,之前在字节和腾讯实习过,这次其实没抱着什么特别大的希望投递,没想到字节可以再给我一次机会,还是挺开心的。 本来以为有个机会就不错啦!没想到能成功上岸,在这里要特别感谢帮我内推的同学&…...
生死疲劳|因为此书莫言获得诺贝尔奖
📚书名:《生死疲劳》 ✏️作者:莫言 历经六世的生死轮回, 三代人无尽的生死疲劳; 触碰极致的痛苦与快乐, 感受不灭的热情与希望。 🔥虽然本书长达39万字,但阅读过程却是无比的酣畅…...
Linux系统编程总结
day2 vim的三种工作模式 命令模式 vi hello.c zz 保存退出 2.编辑模式 i a o s (有大写)可以写东西 3.末行模式: 文本和末行模式不能直接切换 要切换回命令模式 再到末行模式,w:保存 q:退出 按两次esc回到命令模式 vim的基本…...

javascript基础二:Javscript字符串的常用方法有哪些?
在日常开发中,我们对字符串也是操作蛮多,这里我们来整理下字符串的一下最常用的方法 一、操作方法 字符串常用的操作方法归纳为增、删、改、查 增 这里增的意思并不是说直接增添内容,而是创建字符串的一个副本,再进行操作 除了…...

面了个 Java 实习生,小伙很优秀!
大家好,我是鱼皮,前几天给自己的公司面试了一位 Java 暑期实习生,候选人目前是大三。 整个过程我都录屏了,并且在征得候选人的同意后,把面试过程分享出来。一方面是希望对其他在学编程找工作的小伙伴有一些启发和参考…...

Java -并发(多线程)-Interview面试题收集
1、多线程并发 1)多线程中 synchronized 锁升级的原理是什么? synchronized 锁升级原理:在锁对象的对象头里面有一个 threadid 字段,在第一次访问的时候 threadid 为空,jvm 让其持有偏向锁,并将 threadid…...
HashMap的merge()方法
最近遇到一个需求,需要统计各个会员的正在履行合同的合同租金总计,以此作为制定会员等级的标准。但是之前这个方法其实是有的,只是写的乱七八糟,具体的代码就不太方便放上来,就说说大致的代码思路吧。 原代码思路是先查…...
用 mysql_secure_installation 工具来进行密码重置操作(有效)
mysql_secure_installation 工具用于在 MariaDB 中进行一些安全设置,包括重置 root 用户的密码。您可以按照以下步骤使用该工具来重置 root 用户的密码: 1. 以管理员身份登录到您的系统。 2. 执行以下命令以运行 mysql_secure_installation 工具&#…...

【Scala---02】Scala 类与对象 『 类 | 属性 | 访问权限 | 方法 | 继承 | 伴生对象伴生类』
文章目录 1. 定义类2. 属性3. 访问权限4. 方法4.1 方法 vs 函数4.2 方法重写4.3 方法重载4.4 构造方法(1) 构造器定义(2) 构造器的参数列表(3) 构造器私有化 5. 继承6. 伴生对象 & 伴生类6.1 伴生对象的由来6.2 伴生对象 & 伴生类 7. 后续 1. 定义类 Java文件…...
一文掌握python列表的所有使用方法(零基础学python(一))
列表 Python 中的列表是一种可变的数据类型,它可以存储多个值,并且可以随时添加、删除或修改其中的元素。以下是 Python 列表的基本操作和示例代码: 创建列表 可以使用方括号 [] 来创建一个空列表,也可以在方括号中添加元素来创建一个非空列表。例如: empty_list = [] …...

头歌计算机组成原理实验—运算器设计(6)第6关:5位无符号阵列乘法器设计
第6关:5位无符号阵列乘法器设计 实验目的 帮助学生掌握阵列乘法器的实现原理,能够分析阵列乘法器的性能,能在 Logisim 中绘制阵列乘法器电路。 视频讲解 实验内容 在 Logisim 中打开 alu.circ 文件,在5位阵列乘法器中实现斜向…...
Java的运行原理
在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定…...
在已有VPC中创建EKS集群
1. 美东1 默认配置 创建在master-vcp中节点放在两上Public Subnet上,便于SSH登录维护Attach上默认安全组sg-071f18562f41b5804,打通各种常规的网络访问规则cat << EOF > master-eks-cluster.yaml apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata:name…...

Spring boot 注解@Async不生效 无效 不起作用
今天在做公司项目时,有一个发邮件的需求。所以写了一个发送邮件的方法后来发现发邮件很慢,导致接口响应也很慢。于是我便想到要使用异步调用去处理这个方法。于是我把注解Async 加到了自己service类下的一个发邮件的一个方法,后来发现并没有生…...

Chapter03-Authentication vulnerabilities
文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...

华为云Flexus+DeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建
华为云FlexusDeepSeek征文|DeepSeek-V3/R1 商用服务开通全流程与本地部署搭建 前言 如今大模型其性能出色,华为云 ModelArts Studio_MaaS大模型即服务平台华为云内置了大模型,能助力我们轻松驾驭 DeepSeek-V3/R1,本文中将分享如何…...

在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

七、数据库的完整性
七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...