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

Linux操作系统3-文件与IO操作2(文件描述符fd与文件重定向)

上篇文章:Linux操作系统3-文件与IO操作1(从C语言IO操作到系统调用)-CSDN博客

本篇代码Gitee仓库:myLerningCode · 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com)

本篇重点:文件描述符fd与文件重定向

目录

一. 文件描述符fd及其分配规则

二. 文件重定向

2.1 ">"  ">>"  "<"  命令

 2.2 重定向的本质⭐

2.3 使用dup2完成重定向 ⭐

a dup2完成输出重定向

b dup2完成追加重定向

c dup2输入重定向 

​编辑 三. 如何理解Linux下一切皆文件?

四. 下篇内容:C语言FILE与用户级缓冲区与文件系统


一. 文件描述符fd及其分配规则

        在上一篇文章中,我们使用open系统调用打开文件之后。看到返回的fd是一个数字,并且我们输出了stdin,stdout,stderror的文件fd。发现它们分别是1,2,3。

        当时的测试代码如下:

#include <iostream>#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define MY_FILE "log.txt"int main()
{umask(0);int fd1 = open(MY_FILE, O_RDWR | O_CREAT | O_TRUNC, 0666);printf("stdin fd -> %d\n", stdin->_fileno);printf("stdout fd -> %d\n", stdout->_fileno);printf("stderr fd -> %d\n", stderr->_fileno);printf("log.txt fd -> %d\n", fd1);return 0;
}

测试结果如下:

如果我们关闭了stderr在打开log.txt的话,log.txt的文件fd是不是就是2?

测试代码 (注意不能直接使用系统调用close关闭FILE结构体的_fileno,需使用fclose

#include <iostream>#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define MY_FILE "log.txt"int main()
{umask(0);//close(stderr->_fileno);   这样会导致文件描述错误,资源泄漏等问题fclose(stderr); //正确关闭//或者直接//close(2);int fd1 = open(MY_FILE, O_RDWR | O_CREAT | O_TRUNC, 0666);printf("stdin fd -> %d\n", stdin->_fileno);printf("stdout fd -> %d\n", stdout->_fileno);printf("stderr fd -> %d\n", stderr->_fileno);printf("log.txt fd -> %d\n", fd1);return 0;
}

测试结果

         所以文件描述fd的分配规则是:从小到大,按照循环发方式找到文件描述符表中的最小且没有被占用的位置。

        假如我们关闭了1号文件fd,再去向stdout输出数据会发生什么事情?

测试代码:

#include <iostream>#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define MY_FILE "log.txt"int main()
{umask(0);close(1);int fd1 = open(MY_FILE, O_RDWR | O_CREAT | O_TRUNC, 0666);int cnt = 10;while(cnt--){fprintf(stdout,"Hello YZC! [%d]\n",cnt);  //向stdout输出10条数据}return 0;
}

测试结果:

 

        可以看到,我们向屏幕输出数据转化为向log.txt这个文件中输出数据。 

        这种就是我们的文件输出重定向,由屏幕重定向到log.txt这个文件中

二. 文件重定向

2.1 ">"  ">>"  "<"  命令

        文件重定向广泛来说有三种,输出重定向,追加重定向,输入重定向。

        在Linux 中我们使用命令 > 即可完成输出重定向 >>完成追加重定向 < 完成输入重定向

 2.2 重定向的本质⭐

        我们知道,进程PCB通过文件描述符表找到并访问对应的文件

        重定向的本质就是C语言上层用的fd不改变,在内核中改变fd对应的truct_file*的地址。

        比如上面举例中,我们上层没有关闭stdout,而是关闭了stdout原本的标准输出fd(2号)。让后让指向log.txt的文件fd写入到stdout中。这样就完成了向log.txt的标准输出重定向。

2.3 使用dup2完成重定向 ⭐

        dup2可以复制文件描述符fd。函数原型如下

//所需头文件
#include <unistd.h>int dup2(int oldfd, int newfd);//解释
//将oldfd文件文件描述符fd拷贝到newfd
//或者说 将newfd内容更改为oldfd的内容//返回值
//失败返回-1,设置错误码。成功返回文件描述符

        注意:dup2不是简单的更改0,1,2... 。而是将指针数组中的0,1,2的内容struct_file更改

a dup2完成输出重定向

用法举例:

#include <iostream>#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define MY_FILE "log.txt"int main()
{umask(0);int fd1 = open(MY_FILE, O_RDWR | O_CREAT | O_TRUNC, 0666);//将fd 1中的内容由指向标准输出更改为指向log.txtdup2(fd1,1);int cnt = 10;while(cnt--){fprintf(stdout,"Hello YZC! [%d]\n",cnt);  //向stdout输出10条数据}return 0;
}

 测试结果:

        可见,通过dup2我们完成了输出重定向

b dup2完成追加重定向

        想要完成追加重定向,只要将重定向文件的写入方式更改为追加即可

测试举例:

#include <iostream>#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define MY_FILE "log.txt"int main()
{umask(0);//以追加的方式打开,而不是TRUNC清空int fd1 = open(MY_FILE, O_RDWR | O_CREAT | O_APPEND, 0666);//将fd 1中的内容由指向标准输出更改为指向log.txtdup2(fd1,1);int cnt = 10;while(cnt--){fprintf(stdout,"Hello YZC! [%d]\n",cnt);  //向stdout输出10条数据}return 0;
}

测试结果:

c dup2输入重定向 

        我们将文件描述符表中0的内容由标准输入转为由log.txt文件输入

#include <iostream>#include <cstdio>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>#define MY_FILE "log.txt"int main()
{// 以只读方式打开int fd1 = open(MY_FILE, O_RDONLY);// 更改0的中的内容,由标准输入变为由log.txt输入dup2(fd1, 0);char buffer[64];while (true){printf("请输入>");// 向buffer输入数据,若为空,直接跳出循环if (fgets(buffer, sizeof(buffer), stdin) == NULL)break;printf("%s", buffer);}return 0;
}

测试结果如下:

 三. 如何理解Linux下一切皆文件?

        我们知道,被打开的文件有文件描述结构体,这个结构体中包含了文件的各种属性。

struct file
{//文件的各种属性int type;int status;......//文件的读写方法指针int (*readp)();int (*write)();
}

        站在struct file的角度来说,各种文件或者设备(键盘,显示器,鼠标,磁盘等)统一都是 struct file。

        而我们用户通过struct file去调用其中的读写函数指针就能够调用具体的文件或者设备的读写方法。

        通过这种虚拟文件系统,我们就能够摒弃底层硬件的差别。而使用统一的视角去看待各种文件和硬件设备,使用统一的文件接口进行操作。所以说Linux下一切皆文件

        这种设计是不是也符合多态的原则

Linux中的源码 

四. 下篇内容:C语言FILE与用户级缓冲区与文件系统

相关文章:

Linux操作系统3-文件与IO操作2(文件描述符fd与文件重定向)

上篇文章&#xff1a;Linux操作系统3-文件与IO操作1(从C语言IO操作到系统调用)-CSDN博客 本篇代码Gitee仓库&#xff1a;myLerningCode 橘子真甜/Linux操作系统与网络编程学习 - 码云 - 开源中国 (gitee.com) 本篇重点&#xff1a;文件描述符fd与文件重定向 目录 一. 文件描述…...

k8s调度策略

调度策略 binpack&#xff08;装箱策略&#xff09; Binpacking策略&#xff08;又称装箱问题&#xff09;是一种优化算法&#xff0c;用于将物品有效地放入容器&#xff08;或“箱子”&#xff09;中&#xff0c;使得所使用的容器数量最少&#xff0c;Kubernetes等集群管理系…...

uniapp中父组件传参到子组件页面渲染不生效问题处理实战记录

上篇文件介绍了,父组件数据更新正常但是页面渲染不生效的问题,详情可以看下:uniapp中父组件数组更新后与页面渲染数组不一致实战记录 本文在此基础上由于新增需求衍生出新的问题.本文只记录一下解决思路. 下面说下新增需求方便理解场景: 商品信息设置中添加抽奖概率设置…...

螺丝螺帽缺陷检测识别数据集,支持yolo,coco,voc三种格式的标记,一共3081张图片

螺丝螺帽缺陷检测识别数据集&#xff0c;支持yolo&#xff0c;coco&#xff0c;voc三种格式的标记&#xff0c;一共3081张图片 3081总图像数 数据集分割 训练组90&#xff05; 2781图片 有效集7% 220图片 测试集3% 80图片 预处理…...

一个简单带颜色的Map

越简单 越实用。越少设计&#xff0c;越易懂。 需求背景&#xff1a; 创建方法&#xff0c;声明一个hashset&#xff0c; 元素为 {“#DE3200”, “#FA8C00”, “#027B00”, “#27B600”, “#5EB600”} 。 对应的key为 key1 、key2、key3、key4、key5。 封装该方法&#xff0c…...

kubeadm安装K8s集群之基础环境配置

系列文章目录 1.kubeadm安装K8s集群之基础环境配置 2.kubeadm安装K8s集群之高可用组件keepalivednginx 3.kubeadm安装K8s集群之master节点加入 4.kubeadm安装K8s集群之worker1节点加入 kubeadm安装K8s集群基础环境配置 1.首先确保所有机器可以通信&#xff0c;然后配置主机host…...

前端实现在线预览excel文件

在前端开发中&#xff0c;经常会遇到需要在线预览各种文件的需求。本文将介绍如何使用前端技术实现在线预览 Excel 文件的功能。 一、基于微软office服务的excel预览 获取要预览的 Excel 文件的 URL&#xff08;例如存储在 OneDrive 或 SharePoint 上的文件&#xff09;。 使…...

关于idea-Java-servlet-Tomcat-Web开发中出现404NOT FOUND问题的解决

在做web项目时&#xff0c;第一次使用servlet开发链接前端和后端的操作&#xff0c;果不其然&#xff0c;遇到了诸多问题&#xff0c;而遇到最多的就是运行项目打开页面时出现404NOT FOUND的情况。因为这个问题我也是鼓捣了好久&#xff0c;上网查了许多资料才最终解决&#xf…...

SCRM私域流量管理工具助力企业微信电商转型升级

内容概要 在当今数字化时代&#xff0c;SCRM&#xff08;社交客户关系管理&#xff09;私域流量管理工具正逐渐成为企业转型的重要助力。尤其是在电商领域&#xff0c;企业微信的兴起为许多公司打开了新的销售渠道&#xff0c;通过SCRM系统的高效整合&#xff0c;企业能够更加…...

三相异步电动机为什么能够旋转?

三相异步电动机&#xff0c;作为一种广泛应用于工业、农业及其他领域的电动机&#xff0c;其工作原理的理解对于工程技术人员以及相关从业者来说至关重要。 一、三相异步电动机的基本结构 三相异步电动机主要由定子、转子和机壳组成。定子是电动机的静止部分&#xff0c;包含…...

优化移动端H5:常见问题与解决方案

移动端H5开发中的“坑”与解决方案 本文介绍了开发中遇到的几个关于移动端H5开发中的小问题&#xff0c;以及解决的方法。 一、iOS滑动不流畅问题 在iOS设备上&#xff0c;H5页面的滑动效果有时会出现不流畅的情况&#xff0c;特别是在页面高度超过一屏时。这通常是由于iOS的…...

TM1不藏私系列——#10. TM1快速运算的秘密武器-Feeder

与其他BI产品对比&#xff0c;TM1的快速运算能力一骑绝尘。 但是在多维度的数据组合下&#xff0c;TM1是依据什么进行运算的呢&#xff1f; 今天将和大家一同了解TM1快速运算的秘密武器-Feeder。 上期我们提到通过配置维度中的元素权重&#xff0c;可以在合并层级加总计算。除…...

【Python】【Conda 】Conda vs venv:Python开发者的虚拟环境选择指南

目录 引言一、概述1.1 Conda 虚拟环境1.2 Python venv 虚拟环境 二、安装与设置2.1 安装 Conda 虚拟环境2.2 安装 Python venv 虚拟环境 三、依赖管理3.1 Conda 依赖管理3.2 Python venv 依赖管理 四、适用场景五、性能与资源占用5.1 Conda 性能与资源占用5.2 Python venv 性能…...

【从0学英语】06.时态 - 一般过去时

一般过去时&#xff08;Past Simple Tense&#xff09;是表达过去发生的动作、状态或事实的核心时态。这一时态都扮演着不可或缺的角色&#xff0c;本篇文章将全面讲解一般过去时的定义、结构、用法以及常见的动词变化&#xff0c;通过例句和详细的解释帮你理解这一时态。 文章…...

获取cpu序列号-python实现

DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。 需要更多数据资源和技术解决方案&#xff0c;知识星球&#xff1a; “DataBall - X 数据球(free)” -------------------------------------------------------------…...

文献分享: PLAID——为ColBERT架构设计的后期交互驱动器

&#x1f449;前情提要&#xff1a; 神经网络自然语言模型概述 Transformer \text{Transformer} Transformer与注意力机制概述 &#x1f4da;相关论文&#xff1a; BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding \text{BERT: Pre-train…...

IMX6ULL开发板、PC机上的USB网卡、VMware中的Ubuntu的桥接网卡三者互Ping设置及设置

连上PC机上的USB网卡配置 首先打开Windows设备管理器&#xff0c;截图记录下当前的网络适配器&#xff0c;作为插上USB网卡后的对比&#xff1a; 然后打开“更改适配器选项”&#xff0c;也截张图&#xff0c;作为插上USB网卡后的对比&#xff1a; 插上USB网口&#xff0…...

孚盟云 MailAjax.ashx SQL漏洞复现

0x01 产品描述: ‌孚盟云‌是由...

前端 mp4 视频改成 m3u8 流模式

前端 mp4 视频改成 m3u8 流模式 mp4 视频的问题 1、mp4 视频通常对应一个文件&#xff0c;播放时需要加载全部文件&#xff0c;消耗网络资源。如果用户从中间某个时间访问&#xff0c;也会从头开始下载&#xff0c;浪费服务器性能。 2、mp4 视频文件容易被用户下载到本地。有…...

聚焦港口智能接处警,开启平安海运之门

一、概述 港口作为海运的关键枢纽&#xff0c;安全保障至关重要。港口智能接处警系统凭借智能化、数字化、信息化手段&#xff0c;融合 AI 与大数据等前沿技术&#xff0c;旨在实现对港口各类警情的快速、精准处理&#xff0c;有效提升港口应急响应能力&#xff0c;开启平安海…...

`yarn list --pattern element-ui` 是一个 Yarn 命令,用于列出项目中符合指定模式(`element-ui`)的依赖包信息

文章目录 命令解析&#xff1a;功能说明&#xff1a;示例输出&#xff1a;使用场景&#xff1a; yarn list --pattern element-ui 是一个 Yarn 命令&#xff0c;用于列出项目中符合指定模式&#xff08; element-ui&#xff09;的依赖包信息。 命令解析&#xff1a; yarn list…...

ElementEye,网页分析器

介绍 我们经常使用Python写爬虫&#xff0c;爬到网页数据之后&#xff0c;就需要用beautifulSoup进行解析。因为写爬虫并不是我的主营工作&#xff0c;大多数只是用来分析一下想要的数据而已&#xff0c;所以经常会忘记beautifulSoup的用法。 同时&#xff0c;我们总是分析页面…...

健康管理系统(Koa+Vue3)

系统界面(源码末尾获取) 系统技术 Vue3 Koa Nodejs Html Css Js ....... 系统介绍 系统比较简单,轻轻松松面对结业课堂作业.采用的是基于nodejs开发的Koa框架作为后端,采用Vue框架作为前端,完成快速开发和界面展示. 系统获取 啊啊啊宝/KoaVue3https://gitee.com/ah-ah-b…...

智创 AI 新视界 -- AI 助力金融风险管理的新策略(16 - 10)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

Linux内核 -- 字符设备之read write poll基本实现

Linux字符设备&#xff1a;read、write和poll函数实现及完整代码 1. read函数 原型 ssize_t read(struct file *file, char __user *buf, size_t count, loff_t *pos);实现步骤 检查用户缓冲区&#xff1a;使用copy_to_user将数据从内核空间复制到用户空间。返回已读取的字…...

腾讯微信C++面试题及参考答案

64 匹马 8 个赛道,找出前四名,最少赛多少场 为了找出64匹马中的前四名,我们可以按照以下步骤来组织比赛,尽量减少所需要的比赛次数: 初步分组: 将64匹马分成8组,每组8匹马。分别为A、B、C、D、E、F、G、H这8组。每组进行一次比赛来确定各组的速度排序。每个组比赛一次总…...

如何查看内网设备访问互联网时的出口 IP 地址?

在企业VPC中我们通常是一个机房公用一个公网IP&#xff0c;也就是所有的设备共用同一个出口IP。 那么如何查看如何查看内网设备访问互联网时的出口 IP 地址呢&#xff1f; 要查看一台 Linux 内网设备访问互联网时的出口 IP 地址&#xff0c;可以使用以下几种方法&#xff1a;…...

ESP32-S3模组上跑通ES8388(24)

接前一篇文章:ESP32-S3模组上跑通ES8388(23) 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回解析完了es8388_init函数中的第8段代码,本回继续往下解析。为了便于理解和回顾,再次贴出es8388_init函数源码,在components\audio_hal\driver\es8388\es8388.c中,如下: ​ …...

【AIGC系列】frequency_penalty如何通过控制参数提升文本生成的多样性与创造性

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Python+OpenCV系列:图像的运算

文章目录 PythonOpenCV系列&#xff1a;图像的加权和、覆盖1. 图像加权和&#xff08;加权融合&#xff09;2. 图像覆盖&#xff08;区域叠加&#xff09;3. 应用场景4. 总结 PythonOpenCV系列&#xff1a;图像的加权和、覆盖 在图像处理中&#xff0c;图像的加权和与覆盖是两…...

建设网站的一般步骤/石家庄网站seo外包

去官网 xshell&#xff1a;https://www.netsarang.com/download/down_form.html?code522 xftp&#xff1a;https://www.netsarang.com/download/down_form.html?code523 选择Evaluation user / Home & School user 填入自己的邮箱&#xff0c;然后会收到一封邮件&#xf…...

河南网络洛阳网站建设河南网站建设/软文广告怎么写

在中国做企业&#xff0c;“人”永远都是绕不过去的一道坎&#xff0c;你不可能就事论事&#xff0c;也不可能把“事业”做的那么纯粹。中国企业最难逾越的不是企业本身&#xff0c;而是复杂的中国人性&#xff01;一个很古老的故事&#xff1a;从前有座山&#xff0c;山里有座…...

建设门户网站费用/公司营销网站建设

1. 远程连接linux(用Xshell) ssh 用户名服务器的ip ssh s18192.168.235.128 普通用户登录后系统的提示符&#xff1a;$ root用户登录后系统的提示符&#xff1a;# ssh rootip -p port 制定端口号 exit 退出用户登录 2. 查看服务器ip地址 ip addr ifconfig ens33: 网卡名3. 盘符…...

哪个网站专业做安防/百度极速版推广

爬虫项目介绍 有一定的复杂性可以灵活调整项目的复杂性平衡语言/爬虫之间的比重通用爬虫,如baidu,google聚焦爬虫&#xff0c;从互联网获取结构化数据 把网页转换成数据 go语言的爬虫库/框架 henrylee2cn/pholcusgocrawlcollyhu17889/go_spider 不使用现成爬虫库/框架来写一个…...

品牌自适应网站建设/开发一个网站的步骤流程

/** JDK1.5后出现的特性,自动装箱和自动拆箱* 自动装箱: 基本数据类型,直接变成对象* 自动拆箱: 对象中的数据变回基本数据类型* 方便使用* 自动装箱和拆箱弊端,可能出现空指针异常*/ public class IntegerDemo_2 {public static void main(String[] args) {function…...

php做动态网站/seo搜索引擎优化技术

SQL Server 数据库启动过程&#xff0c;以及启动不起来的各种问题的分析及解决技巧参考文章&#xff1a; &#xff08;1&#xff09;SQL Server 数据库启动过程&#xff0c;以及启动不起来的各种问题的分析及解决技巧 &#xff08;2&#xff09;https://www.cnblogs.com/VicL…...