Linux基础I/O之文件描述符fd 重定向(下)

目录

四、文件描述符

4.1 文件描述符的内核本质

4.2 文件描述符的分配规则

五、重定向


四、文件描述符

在回忆起上述知识后,那么文件描述符到底是什么呢?
我们不难注意到,刚刚的open接口系统调用接口其实是有返回值的(一个int的整数),其实这个返回值就是文件描述符。同样我们的write接口也用到了文件描述符,根据我们的代码,我们不难发现,当我们通过系统调用进行写文件的操作时,并没有给其传递文件名和路径信息,那么它如何向我们想要写入的文件进行写入的呢? --- 说明肯定有东西指向我们想要写入的文件 --- 这个东西就是我们的文件描述符 --- 那么问题又来了 --- 其为什么能代指一个文件呢? --- 这就需要我们对其在内核的本质进行描述了。

4.1 文件描述符的内核本质

在讲文件描述符怎么来之前,我们先来讲讲文件。
首先可以明确的一点是,如果我们的程序(进程)想要对一个文件进行操作,那么根据冯诺依曼体系结构,其一定要被先加载到内存中来,那么这个时候OS一定需要对其进行管理,如何管理呢?--- 先描述再组织 --- 于是就有了描述文件的内核级别的数据结构。那么这个结构中会有一些什么内容呢?我们用图来了解。

这里面首先有属性我们可以理解,缓冲区我们之后说,那么这个文件的操作方法集是什么呢?有什么作用呢? --- 首先我们可以知道各种硬件设备,根据我们之前的理论中(Linux下一切皆文件),其也是各种文件,那如果我们想要操作不同的硬件设备,是不是要使用不同的读写方法,那如果我们要对每一个文件都维护一个不同名的操作方法,到时候用起来是不是很麻烦,所以我们采取一种不同的策略。

我们采取函数指针的方式,通过指向不同的实现方法,从而达到上层统一的效果,也可以理解为多态。

4.2 文件描述符的分配规则

说了这么多,那么什么是文件描述符依旧还没提到,别急,马上就来了。
我们刚刚了解的只是OS将硬件抽象出来并管理起来的过程,但是还没有交付给我们需要的进程,于是就有了下图

可以看到,这个指针的前三个内容我给其单独空出来了,并没有让其指向我们的磁盘文件等,只是为什么呢? --- 因为当我们允许一个程序时,OS会为我们自动打开三个文件(标准输入,标准输出,标准错误),并且将其放在数组下标0,1,2的位置。

文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符

也就是说,当我们打开一个新的文件的时候,给的文件描述符不会是0,1,2,除非这期间我们主动关闭了这其中的文件。

五、重定向

        我们知道Linux下一切皆文件,所以我们输出的信息,一定是在向文件进行写入,而这个文件是显示器文件,所以我们可以看到写入的信息。而我们又知道,标准输出的文件描述符是1,如果我们通过文件描述符将标准输出关闭,并打开一个新的文件,根据我们的文件描述符分配原则,这个文件的文件描述符将会是1。又因为OS是默认向1号描述符中的文件进行输出的(OS并不关心文件描述符1指向的是不是显示器文件),所以此时我们再进行输出的话,就是相当于向我们指定的文件进行写入,这就是我们的重定向。

     这里我们可以写一段代码验证一下,这里我们需要用到一个系统调用去帮助我们完成验证:

这个系统调用的功能是将oldfd给给我们的newfd使得其文件描述符一致,在这里我们可以通过这个系统调用,从而实现我们的重定向。

根据这段代码,我们不难发现,我们应该是要往我们的words.txt中进行写入hello world,接下来让我们验证一下。

很明显,在我们运行程序的时候,原本应该直接打印在屏幕上的hello world被写入到了words.txt中,这也证实了我们刚刚所了解到的,那么输入重定向和追加重定向就交给大家自行尝试啦。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

FTP(File Transfer Protocal,文件传输协议)

文章目录 引言FTP管理工具FTP客户端FTP连接模式控制连接数据连接FTP命令/响应FTP命令FTP响应FTPSSFTP引言 FTP(File Transfer Protocal,文件传输协议)用于建立两台主机间的数据文件传输下载。使用客户/服务器(Client/Server)架构,基于TCP协议,服务端口为21。 FTP链接…

17.延迟队列

介绍 延迟队列,队列内部是有序的,延迟队列中的元素是希望在指定时间到了以后或之前取出和处理。 死信队列中,消息TTL过期的情况其实就是延迟队列。 使用场景 1.订单在十分钟内未支付则自动取消。 2.新创建的店铺,如果十天内没…

行锁表锁都是渣渣,元数据锁才是隐藏大佬

什么是元数据锁? 英文名叫Metadata Lock,缩写为MDL,顾名思义,它是针对元数据的一种锁,锁的是元数据。 那什么是元数据? 一张表有100条记录,这里的记录我们可以称之为表数据,一张表…

深入了解:MinIO 企业对象存储的可观察性

可观测性是指收集信息(跟踪、日志、指标),以提高性能、可靠性和可用性为目标。很少有人能确定其中一个事件的根本原因。通常情况下,当我们将这些信息关联起来形成叙述时,我们就会有更好的理解。从一开始,Mi…

7.27扣...

知识点补充: 1.StringBuilder StringBuilder 类在 Java 中是一个可变字符序列。与 String 类不同,StringBuilder 可以在创建之后被修改。这意味着你可以向 StringBuilder 对象追加、插入或删除字符,而不需要创建新的对象(辅助数…

池化层pytorch最大池化练习

神经网络构建 class Tudui(nn.Module):def __init__(self):super(Tudui, self).__init__()self.maxpool1 MaxPool2d(kernel_size3, ceil_modeFalse)def forward(self, input):output self.maxpool1(input)return output Tensorboard 处理 writer SummaryWriter("./l…

F4A0手把手教程1: 华大单片机HC32F4A0如何新建工程(ddl库版本)

开发板请点击:https://item.taobao.com/item.htm?spma21n57.1.item.3.5fc760c3ycChCu&priceTId2150418a17219238749041878ec06d&utparam%7B%22aplus_abtest%22:%222166044947a45798ae4c3d102fcea719%22%7D&id707262644934&ns1&abbucket20 准备…

高速板开源工程的学习(一)

泰山派NAS-原理图和PCB设计经验分享-塞塞哇 (saisaiwa.com) BGA扇出的时候千万小心,导线到焊盘的距离大于0.1MM,千万小心,不然会寄寄的,这个在设计规则里面可以设置: 这种就容易造成阻焊开窗的误判,是很不规范的&…

PyTorch+AlexNet代码实训

参考文章:https://blog.csdn.net/red_stone1/article/details/122974771 数据集: 打标签: import os# os.path.join: 每个参数都是一个路径段,将它们连接起来形成有效的路径名。 train_txt_path os.path.join("data"…

浅谈HOST,DNS与CDN

首先这个是网络安全的基础,需得牢牢掌握。 1.什么是HOST HOSTS文件: 定义: HOSTS文件是一个操作系统级别的文本文件,通常位于操作系统的系统目录中(如Windows系统下的C:\Windows\System32\drivers\etc\hosts&#xf…

java数据结构(1):集合框架,时间,空间复杂度,初识泛型

目录 一 java数据结构的集合框架 1.什么是数据结构 2.集合框架 2.1什么是集合框架: 1. 接口 (Interfaces) 2. 实现类 (Implementations) 3. 算法 (Algorithms) 4. 并发集合 (Concurrent Collections) 2.2集合框架的优点: 二 时间和空间复杂度 …

请你谈谈:spring AOP的浅显认识?

在Java面向对象编程中,解决代码重复是一个重要的目标,旨在提高代码的可维护性、可读性和复用性。你提到的两个步骤——抽取成方法和抽取类,是常见的重构手段。然而,正如你所指出的,即使抽取成类,有时仍然会…

【Redis宕机啦!】Redis数据恢复策略:RDB vs AOF vs RDB+AOF

文章目录 Redis宕机了,如何恢复数据为什么要做持久化持久化策略RDBredis.conf中配置RDBCopy-On-Write, COW快照的频率如何把握优缺点 AOFAOF日志内容redis.conf中配置AOF写回策略AOF日志重写AOF重写会阻塞吗优缺点 RDB和AOF混合方式总结 Redis宕机了,如何…

Spring Bean - xml 配置文件创建对象

类型&#xff1a; 1、值类型 2、null &#xff08;标签&#xff09; 3、特殊符号 &#xff08;< -> < &#xff09; 4、CDATA <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/bea…

分布式锁的三种实现方式:Redis、基于数据库和Zookeeper

分布式锁的实现 操作共享资源&#xff1a;例如操作数据库中的唯一用户数据、订单系统、优惠券系统、积分系统等&#xff0c;这些系统需要修改用户数据&#xff0c;而多个系统可能同时修改同一份数据&#xff0c;这时就需要使用分布式锁来控制访问&#xff0c;防止数据不一致。…

最新爆火的开源AI项目 | LivePortrait 本地安装教程

LivePortrait 本地部署教程&#xff0c;强大且开源的可控人像AI视频生成 1&#xff0c;准备工作&#xff0c;本地下载代码并准备环境&#xff0c;运行命令前需安装git 以下操作不要安装在C盘和容量较小的硬盘&#xff0c;可以找个大点的硬盘装哟 2&#xff0c;需要安装FFmp…

项目开发实战案例 —— Spring Boot + MyBatis + Hibernate + Spring Cloud

作者简介 我是本书的作者&#xff0c;拥有多年Java Web开发经验&#xff0c;致力于帮助更多开发者快速掌握并运用Java Web技术栈中的关键框架和技术。本书旨在通过实战案例的方式&#xff0c;带领读者深入理解并实践Spring Boot、MyBatis、Hibernate以及Spring Cloud等热门技术…

2-46 基于matlab的声音信号的短时能量、短时过零率、端点检测

基于matlab的声音信号的短时能量、短时过零率、端点检测。通过计算计算短时能量、调整能量门限&#xff0c;然后开始端点检测。输出可视化结果。程序已调通&#xff0c;可直接运行。 2-46 短时能量 短时过零率 端点检测 - 小红书 (xiaohongshu.com)

Vue element ui分页组件示例

https://andi.cn/page/621615.html

Camera Raw:预设

Camera Raw 的预设 Presetss模块能够简化和加速照片编辑过程。预设不仅能大大提升工作效率&#xff0c;还能确保处理结果的一致性和专业性。 快捷键&#xff1a;Shift P 预设 Preset与配置文件、快照有其异同之处&#xff0c;它们都可以快速改变照片的影调和颜色。 不同是&…