【Linux】访问文件的本质|文件描述符|文件重定向

news2024/11/25 12:48:55

文章目录

  • 文件的结构
  • 文件描述符
    • 标准输入输出
    • 文件描述符的规则
  • 文件重定向
    • 输出重定向(对应符号'>')
      • echo的输出重定向
    • 输入重定向(对应符号'<')
    • 追加重定向(对应符号‘>>’)
    • 实现文件重定向的函数dup2()
      • 参数
      • 测试

前言:本文探讨的是操作系统中的文件本质,探讨“打开的文件”,与语言无关。

观察我们平时写的C语言文件操作的函数,例如:

FILE* fp = fopen("log.txt", "w");

可以发现返回值的类型是FILE* ,那么这个FILE*到底是什么?

FILE* 是C库自己封装的结构题FILE的指针

系统调用接口中,我们会使用下面的函数:

int fd = open("log.txt", O_WRONLY|O_CREAT|O_TRUNC);

可以发现返回值的类型是int,返回的内容是fd。这个fd我们称为文件描述符。

文件的结构

关于文件的结构,可以对比进程的结构,都i是差不多的。
当操作系统想管理文件的时候,需要做的是什么呢?
先把文件描述出来,然后再对大量的文件进行组织 — > 先描述再组织

对于文件,有很多属性,那我们就需要对每个属性进行封装,需要一个task_struct结构体对这些属性进行封装。

在task_struct中,有struct files_struct 结构体,这个结构体就是管理文件的。每创建一个文件,就在files_struct中进行一些操作(具体操作后面详细说明)。

那么,在task_struct中,想要对files_struct中进行操作,就需要有files_struct的指针,也就是 struct files_struct *f,这个指针操作files_struct。

在files_struct中有很多struct_file对象,每打开一个文件,就创建一个struct_file对象,在这个struct_file中存储的是什么呢?就是文件的各种属性:在磁盘的什么位置,基本属性,权限,大小,读写位置等,最重要的是struct_file * next指针,正是因为有了这个指针,就导致所有分离的文件通过链表的形式连接起来了。

现在我们已经知道struct_file对象通过链表连接起来了,就相当于一串一样,此时,在struct_file的上级 file_struct中是不是存了管理struct_file的指针。此时,在file_struct中创建一个数组,数组的内容就是存放指针,所以该数组是指针数组。数组的下标,我们就称为文件描述符,就是fd这个数组我们就叫文件描述符表。

在这里插入图片描述
这些都可以在操作系统的源码中看到

文件描述符

标准输入输出

在这里插入图片描述
运行结果:
在这里插入图片描述
根据结果可以发现文件描述符fd = 3。
为什么是3? 0,1,2去哪里了?
在这里插入图片描述
0号文件 —— stdin —— 标准输入
1号文件 —— stdout —— 标准输出
2号文件 —— stderr —— 标准错误

如何验证?

在这里插入图片描述
在这里插入图片描述
从这里可以看出0号文件确实就是stdin。

文件描述符的规则

在这里插入图片描述
上述代码中 close(1)表示的是将1号文件关闭。
接着,打开了一个叫做log.txt的文件。
将msg中内容写入到1号文件中。 1号文件是标准输出。

观察输出结果:
在这里插入图片描述
为什么我们明明是向1号文件中写入,不写入到标准输出(显示器)上,反而出现在了log.txt的文件中?

因为我们刚刚做了一个操作,是close(1),关闭1号文件。还记得我们之前有一个示例代码中打开文件,fd = 3,那时是因为0,1,2文件都被占用了,所以是3号文件。

现在1号文件的位置被腾出来了,所以新打开的文件就从前往后扫描,哪里空闲,就直接写入就行了。

这就是为什么向1号文件写入,却写进了log.txt中原因了。因为此时log.txt的文件的fd = 1.

本来如果不关闭1号文件,应该是如下图的结构
在这里插入图片描述
在关闭之后就变成下面这样了。
在这里插入图片描述

文件重定向

文件重定向有输出重定向,输入重定向,追加重定向,下面一一讲解。

输出重定向(对应符号’>')

其实上面的例子就是输出重定向。
在这里插入图片描述
所谓输出重定向,就是将本该输出到x的内容输出到y中。
操作:断开fd = i与文件x的链接,将fd = i 和 文件y重新建立连接。
上面的例子就是:本来应该输出到stdout中,但是由于将fd = 1和stdout的链接断了,并将log.txt链入到fd = 1中,所以输出就到了log.txt中。

echo的输出重定向

在这里插入图片描述
本来echo是向显示器中打印内容,现在:
将echo和stdout的链接断开,并重新建立echo和log.txt的链接
从而,可以将echo的内容打印到log.txt中。

输入重定向(对应符号’<')

同输出重定向一样,输入重定向就是将fd = 0 和stdin的链接断了,然后重新链接。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
上面的代码就是将stdin中的内容输入到buffer中。
我们将fd = 0和stdin的链接关了,并打开了一个文件test.txt,此时test.txt的fd = 0.
此时text.txt就是stdin
所以代码中将stdin写入到buffer中,其实是将fd = 0的文件的内容写入到buffer中,此时fd = 0的文件是test.txt,所以就是将test.txt的内容写入到buffer中。

追加重定向(对应符号‘>>’)

追加重定向和输出重定向的区别就是:
输出重定向会覆盖之前写的内容
追加重定向是在原本的内容之上进行追加,不会覆盖
在这里插入图片描述

结果:
在这里插入图片描述
最前面的字母是原来的,后面的汉字是追加的。

实现文件重定向的函数dup2()

dup2是实现文件重定向的函数,有了这个函数我们就不需要自己操作close(fd)再重新连接。

dup2的函数描述
在这里插入图片描述

参数

int dup2(int oldfd, int newfd)

可以看到有oldfd和newfd,该怎么理解?
oldfd就是我们准备重定向到的文件,在前面的例子中就是test.txt, newfd就是我们准备断开链接的文件,在前面的例子中就是1或者 0

函数解释:简单来说就是将oldfd的地址拷贝一份,让newfd指向oldfd的地址。

测试

在这里插入图片描述
测试结果:
在这里插入图片描述

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

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

相关文章

语文教学方法有哪些,产生了什么效果

你是否曾想过&#xff0c;一位普通的语文老师如何化身为智慧的引导者&#xff0c;点燃学生心中的求知之火&#xff1f;让我们一起探寻那些神奇的语文教学方法&#xff0c;以及它们带来的深远影响。 不仅让知识变得容易理解&#xff0c;更在无形中培养了学生的各项能力。通过谈话…

《JAVA与模式》之命令模式

系列文章目录 文章目录 系列文章目录前言一、命令模式的结构二、AudioPlayer系统三、宏命令四、命令模式的优点 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章…

笔记本上使用usb蓝牙适配器

注意 必须先禁用笔记本上原来的蓝牙功能 禁用笔记本原来的蓝牙功能 使用usb蓝牙适配器

openEuler系统远程SSH远程连接

文章目录 1. 本地SSH连接测试2. openEuler安装Cpolar3. 配置 SSH公网地址4. 公网远程SSH连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 欧拉操作系统(openEuler, 简称“欧拉”)是面向数字基础设施的操作系统,支持服务器、云计算、边缘openEuler是面向数字基础设施的操作系…

Latent Topic-aware Multi-Label Classification

X t ^t t and X s ^s s分别是训练和测试输入矩阵 predictive model h of the mapping between X t ^t t and Y t ^t t in the training data can be applied to the testing data&#xff0c;predictive model g of the mapping between X t ^t t and X s ^s s in the input da…

免费SSL证书有效期

免费SSL证书有效期现状 目前市场上主流的免费SSL证书提供商大多遵循行业规范&#xff0c;将免费证书的有效期设为3个月。这意味着每隔三个月&#xff0c;网站管理员必须重新申请、验证并安装新的SSL证书&#xff0c;以维持网站的HTTPS安全连接状态。这种做法已成为行业的常态&…

顶顶通呼叫中心中间件-如何利用机器人话术转接到坐席中

文章目录 前言联系我们实现方法 前言 场景&#xff1a;机器人话术执行到某一节点需要转接到人工坐席中&#xff0c;且呼叫坐席超时后可以返回到机器人话术中&#xff0c;然后继续执行话术剩下的流程。 联系我们 有意向了解呼叫中心中间件的用户&#xff0c;可以点击该链接添加…

MQTT.fx下载使用详解

mqtt.fx是一款基于 Eclipse Paho&#xff0c;使用 Java 语言编写的 MQTT 客户端工具。支持通过 Topic 订阅和发布消息&#xff0c;用来前期和物联网云平台调试非常方便。 &#xff08;一&#xff09;下载软件 傻瓜式安装 链接&#xff1a;https://pan.baidu.com/s/1PxXnuIPN…

基于springboot+vue的医疗挂号管理系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

Tomcat实现java博客项目、状态页及常见配置介绍

目录 一、自建博客 1. 项目背景 2. 操作示例 二、状态页 1. 概述 2. server status 信息状态页 3. manager app 项目管理状态页 4. host manger 虚拟主机管理状态页 三、常见配置 1. 端口8005/tcp安全配置管理 2. tomcat端口号 3. 虚拟主机设置 4. Context配置 一…

我国离子注入设备市场规模不断增加 本土企业仍有较大发展空间

我国离子注入设备市场规模不断增加 本土企业仍有较大发展空间 离子注入是半导体器件和集成电路生产的关键工艺之一&#xff0c;其提供的高精度和高均匀性可以大幅度提高集成电路的成品率。离子注入设备是芯片制造的核心工艺装备。 从全球市场来看&#xff0c;随着科学技术不断进…

Provisional headers are shown报错原因支付宝小程序跳转页面时Ajax请求被杀死

报错 Provisional headers are shown 支付宝小程序一个页面请求没有结束&#xff0c;就跳转到了另一个页面 解决&#xff1a; - 等待请求结束再跳转 - 使用settimeout使进程在宏任务队列不会被杀死 携带参数太多&#xff0c;请求头过大导致支付宝中请求表现为无响应。【在另一…

当Sora风靡,AI风潮吹醒金融科技

以下文章来源&#xff1a;凤凰网 前有OpenAI发布了Sora&#xff0c; 后有苹果放弃了秘密进行了十年的造车项目&#xff0c;转身拥抱AI&#xff0c; 再有国内市场上此起彼伏的AI呐喊声&#xff0c; 一场以AI为主导的新热浪&#xff0c;正在来袭。 当AI的风潮开始兴盛&#x…

【视频转码】基于ZLMediakit的视频转码技术概述

一、概述 zlmediakit pro版本支持基于ffmpeg的转码能力&#xff0c;在开源版本强大功能的基础上&#xff0c;新增支持如下能力&#xff1a; 1、音视频间任意转码(包括h265/h264/opus/g711/aac等)。2、基于配置文件的转码&#xff0c;支持设置比特率&#xff0c;codec类型等参…

js设计模式:解释器模式

作用: 对文本进行解释和编译的时候,就会用到解释器模式 比如你写了一段js代码,js引擎就会去解释并执行这段代码 webpack中的各种loader就是用来解释各种文件类型的,并将其解释为js可识别的代码 示例: //翻译词库const wordList [{text:韩信前期有蓝有红,必须拿二杀。你要是…

电脑解锁后黑屏有鼠标--亲测!!不需要重装系统!!

问题&#xff1a;上周电脑黑屏&#xff0c;只有鼠标&#xff0c;鼠标还不能右键&#xff01;&#xff01; 中招&#xff1a;win10系统最新版火绒安全 &#xff0c;那你有概率获得开机黑屏套餐一份。 原因是&#xff1a;火绒把我们的explorer删除了导致黑屏&#xff0c;这个文…

医院床旁交互系统概述 -智慧护理-全视通

全视通床旁交互系统是一种先进的医疗信息技术解决方案&#xff0c;旨在改善病患与医疗团队之间的沟通与交流。该系统通过集成多种高科技设备&#xff0c;为病患在病床边提供了一站式的信息交互平台&#xff0c;从而优化了医疗服务流程&#xff0c;提升了医疗体验。 首先&#x…

C# LaMa Image Inpainting 图像修复 Onnx Demo

目录 介绍 效果 模型信息 项目 代码 下载 LaMa Image Inpainting 图像修复 Onnx Demo 介绍 gihub地址&#xff1a;https://github.com/advimman/lama &#x1f999; LaMa Image Inpainting, Resolution-robust Large Mask Inpainting with Fourier Convolutions, WAC…

Python 应用程序编程接口库之pywin32使用详解

概要 在Python的世界里,有许多优秀的第三方库可以帮助开发者更轻松地处理各种任务。其中,pywin32库是一个特别引人注目的工具,它提供了对Windows API的完整访问,使得开发者能够利用Python来编写强大的Windows应用程序,从简单的脚本到复杂的桌面应用,pywin32都能胜任。 什…

anaconda创建虚拟环境(第一次玩)

首先需要打开anaconda prompt&#xff0c;打开后需要等待一会&#xff0c;他要加载。 然后你输入下面的代码&#xff0c;其中环境名和python版本可以自定义 conda create -n 环境名 python3.6比如我的是 conda create -n mnist python3.7.0 等待一会&#xff0c;中途需要你输…