Linux——文件描述符(fd)与重定向、dup/dup2

news2024/9/25 23:22:39

目录

一.文件描述符

(一).含义

(二).使用

(三).标准输入/输出/错误

二.重定向与dup/dup2

(一).dup/dup2 

(二).重定向 


一.文件描述符

(一).含义

文件描述符(file descriptor)简称为fd,其本质就是一个数组下标

当创建一个进程时,操作系统不仅会创建task_struct结构体(PCB进程控制块),还会创建一个files_struct结构体用于表示该进程打开的相关文件。进程控制块中有一个指针会指向该files_struct。

 在files_struct结构体内部,有一个结构体指针数组fd_array。fd_array是一个数组,里面存放的是指针,每一个指针都指向一个file结构体。

文件描述符fd就是fd_array的数组下标。

(二).使用

以c语言fwrite函数为例,fwrite内部通过FILE结构体找到文件描述符fd,同时调用系统接口write。

操作系统根据调用的write的进程,通过task_struct结构体内部指针,找到files_struct,再通过files_struct内的fd_array指针数组,依照write传入的具体fd值(下标),找到对应的file结构体,就找到了相关文件。

图例如下:

当进程打开一个文件时,系统就会在fd_array内部从0下标开始依次寻找尚未指向具体file的指针(空指针),将该文件的file结构体给这个指针。 

关闭一个文件时,fd_array中相关指针会指向空,当再其他文件打开时,按照从0开始寻找空指针的方式,找到该空指针,让其指向新的文件。

(三).标准输入/输出/错误

名称硬件FILE*fd
标准输入键盘stdin0
标准输出显示器stdout1
标准错误显示器stderr2

以C语言为例,<stdio.h>头文件内部已经提前打开了三个文件(两个硬件:键盘、显示器)。

即标准输入、标准输出、标准错误。依照fd_array对文件描述符的分配规则,从0下标开始依次指向具体的file。这也就是为什么标准输入、标准输出、标准错误的fd默认为0、1、2。

所以,下面代码也就很好理解了:

int main()
{
	const char* str = "hello world\n";
	fwrite(str, strlen(str), 1, stdout);
	return 0;
}

stdout是<stdio.h>头文件定义的表示显示器的FILE指针,指针指向的FILE结构体内部fd值为1,因此fwrite直接通过stdout这个指针获得相关fd,进而使用显示器。

二.重定向与dup/dup2

有了对于文件描述符的理解, 重定向的概念就很好理解了。

(一).dup/dup2 

这种替换可以通过系统接口dup2完成。

不管是dup还是dup2因为是系统接口,其参数均是文件描述符fd。 

dup可以返回一个新的fd来表示传入的oldfd所代表的文件,即赋予该文件另一个fd。

dup2可以将oldfd所代表的文件给newfd,如果两个fd所代表的文件本就相等,那将不做任何改动。

dup2在使用时常常容易搞错复制方向,可以这样理解:dup2(copy from, copy to)

 如果调用失败,均返回-1。

(二).重定向 

重定向本质是使fd_array中指向原文件的指针指向目标文件。 

 以标准输出重定向为例:

[cdl@VM-16-9-centos ~]$ echo "hello world" > file.txt

本质就是将fd_array中原本指向显示器file的指针指向file.txt的file结构体,即:

FILE* file = fopen("./file.txt", ...);
dup2(file._fileno, 1);

echo还是将数据给fd为1的指针指向的文件,但因为fd=1的指针指向了file.txt(的file结构体),因此echo把数据给了file.txt。 

图示如下:

追加重定向就是在打开file.txt文件时就赋予文件追加属性,相当于这样:

//系统open接口,O_TRUNC:按追加方式打开文件
int fd = open("./file.txt", O_CREAT | O_RDWR | O_TRUNC);

愚者困惑,智者提问——Benjamin Disraeli


如有错误,敬请斧正

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

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

相关文章

MCE | 淀粉样蛋白沉积或是阿尔茨海默症发展“驱动者”

近日&#xff0c;Cell 在线发表的论文 “Spatial Transcriptomics and In Situ Sequencing to Study Alzheimer’s Disease” 中&#xff0c;研究团队在 AD 小鼠模型中&#xff0c;利用空间转录组学研究淀粉样斑块周围直径 100 μm 的组织结构域的转录变化&#xff0c;证明了丰…

Web(二)html5基础-文档头部(知识训练和编程训练)

web知识训练_html5_文档头部标签及属性 web编程训练_html5_文档头部 第1关_页面标题及字符集的设置 <!DOCTYPE html> <html> <head><!-- ********* Begin ********* --><meta charset"utf-8"><title>设置标题</title>&…

《传统文化典藏馆》前端模板

一个基于多种插件的前端二次开发——弘扬中华传统文化的前端模板&#xff0c;内容丰富&#xff0c;可做学习前端技术使用。 主要技术实现&#xff1a;HTML、CSS、JavaScript 下载链接&#xff1a; 弘扬中华传统文化前端模板-Javascript文档类资源-CSDN下载《传统文化典藏馆》…

图像分割 - 分水岭算法

目录 1. 介绍 2. 分水岭算法的实现 距离变换 连接连通分量 3. 代码 1. 介绍 图像是由x&#xff0c;y表示的&#xff0c;如果将灰度值也考虑进去的话&#xff0c;那么一幅图像需要一个三维的空间去表示。 这样就可以把x&#xff0c;y轴比作大地&#xff0c;将灰度值的z轴…

产品流程图设计

一个产品设计之初&#xff0c;必先从流程图做起&#xff0c;流程图可以用来表达产品各式各样的流程&#xff0c;好的流程图&#xff0c;可以快速让整个团队熟悉理解业务&#xff0c;并优化业务。 一、常用的流程图图标含义 流程图通常由起止框、处理框、流程线、判断框、输出输…

使用HTML制作静态网站 中国传统文化 丝绸之路 (学生网页设计作业源码)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

HummerRisk V0.5.2:升级对象存储、云检测、云审计和K8s资源态势等

HummerRisk V0.5.2发布&#xff1a;对象存储增加风险检测和操作、云检测支持七牛云、操作审计支持 AWS&#xff0c;提升 K8s 资源态势&#xff0c;并支持在线/离线升级漏洞库。 感谢社区中小伙伴们的反馈&#xff0c;你们的认可是我们前进的动力。 HummerRisk 保持高速的迭代…

Web App、Hybrid App、Native App 横向对比

移动端的开发方式三分天下&#xff1a;纯原生&#xff08;Native App&#xff09;、混合开发&#xff08;Hybird App&#xff09;、网页应用&#xff08;Web App&#xff09;。 纯原生&#xff08;Native App&#xff09;&#xff1a;是在 Android、iOS 等移动平台上利用提供的…

2023第三届中国数字化人才国际峰会

会议背景 中商产业研究院预测&#xff0c;2022年我国数字经济规模将增至48.9万亿元&#xff0c;数字经济在GDP中的比重将超过40%。随着中国经济数字化转型不断深入的同时&#xff0c;数字化人才缺口却近1100万。中国信息通信研究院发布的《数字经济就业影响研究报告》指出&…

数学统计:均值、标准差、方差、协方差

均值:均值描述的是样本集合的中间点,它告诉我们的信息是很有限的。 标准差:标准差给我们描述的则是样本集合的各个样本点到均值的距离之平均。以这两个集合为例,[0,8,12,20]和[8,9,11,12],两个集合的均值都是10,但显然两个集合差别是很大的,计算两者的标准差,前…

蓝牙运动耳机什么品牌性价比高,六款值得推荐的运动耳机分享

音乐是运动健身的伴侣&#xff0c;两者合在一起就能让运动变得更加有劲。运动耳机怎么选&#xff0c;想要找到一款不错的运动耳机&#xff0c;首先一定要牢固舒适&#xff0c;其次防水性能越高越好&#xff0c;最后音质偏低音&#xff0c;如果在户外跑步的话&#xff0c;放着大…

Android App开发网络通信中使用okhttp下载和上传图片、文件讲解及实战(超详细实现用户注册信息上传 附源码)

需要源码请点赞关注收藏后评论区留言并且私信~~~ 一、使用okhttp下载图片 okhttp不但简化了HTTP接口的调用过程&#xff0c;连下载文件都变得简单了&#xff0c;对于一般的文件下载&#xff0c;按照常规的GET方式调用流程&#xff0c;只要重写回调方法onResponse&#xff0c;在…

C++:指针:void*指针(跳跃力未定的指针)

先分享一段代码&#xff0c;觉得很有意思 #include<iostream> void* say_hello(void* args){std::cout<< "Hello world"<< std::endl;return 0; } 上面这段代码&#xff0c;我们看到函数的返回值类型竟然是 void* ,形参也是 void* &#xff0c…

限时开源,一份“扭转乾坤”的与时俱进的1700页Java八股文

今天在某客看到一个程序员自述&#xff0c;内容如下&#xff1a; 人到三十&#xff0c;公司效益不好被裁员&#xff0c;两个月时间面了三十几家&#xff0c;一直不是很顺利&#xff0c;面试问八股&#xff0c;根本答不上来。前期不信邪&#xff0c;正常投简历正常面试&#xf…

如何借助现有股票量化交易平台编写策略和回测分析

每个交易日的股票都会上涨或者下跌&#xff0c;在这个过程中笔者们偶尔会想针对部分股票进行股价的涨跌幅进行监控&#xff0c;或者自动进行交易&#xff0c;在这个需求前提下&#xff0c;现有券商、股票分析软件都会带有机器人自动交易策略功能&#xff0c;大部分都需要收费或…

web网页大作业——基于HTML+CSS+JavaScript制作摄影之家网站

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

OAuth2 的授权流程

文章目录&#x1f4d6; OAuth2 的授权流程&#x1f4d1; 参与的角色&#x1f4d1; 授权流程&#x1f4d1; 授权许可 Authorization Grant&#x1f4d1; 直白话 OAuth2 流程&#x1f4d6; OAuth2 的授权流程 &#x1f4d1; 参与的角色 1️⃣ Resource Owner资源所有者&#xf…

如何监听电脑屏幕是否发生切换

目录 1.屏幕监听的原理&#xff1a; 2.创建项目 3.离开计时 1.屏幕监听的原理&#xff1a; 为什么可以监听浏览器窗口的切换呢&#xff1f;那就是利用了浏览器的visibilitychange属性&#xff0c;MDN的介绍对visibilitychnge的介绍是&#xff1a; 当其选项卡的内容变得可见或…

nginx(六十二)proxy模块(三)接收用户请求的包体

一 接收用户请求包体 nginx读取请求体的源码分析 说明&#xff1a; 虽然是被http core核心框架处理,但是被proxy反向代理模块使用重点&#xff1a; 哪些指令控制接收request body的行为? ① proxy_request_buffering 控制&#xff1a; nginx接收客户端 request body的方式…

【优化选址】遗传算法求解物流配送中心选址【含Matlab源码 1917期】

⛄一、物流选址简介 1 引言 配送中心是物流系统网络中的关键节点和重要的基础设施&#xff0c;在整个物流系统网络规划中起着枢纽性的作用[1]。快递物流配送中心选址是指在具有若干个发件网点或者若干个收件网点的物流配送区域内&#xff0c;综合考虑物流运输成本、配送中心建…