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

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文件&#xf…...

一文掌握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不生效 无效 不起作用

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

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...