linux存储--dup和dup2函数解析(十八)
1、文件描述符在内核中数据结构
在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态。一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从shell中运行一个进程,默认会有3个文件描述符存在(0、1、2),0与进程的标准输入相关联,1与进程的标准输出相关联,2与进程的标准错误输出相关联,一个进程当前有哪些打开的文件描述符可以通过/proc/进程ID/fd目录查看。如下图:
文件表中包含:文件状态标志、当前文件偏移量、v节点指针,这些不是本文讨论的重点,我们只需要知道每个打开的文件描述符(fd标志)在进程表中都有自己的文件表项,由文件指针指向。
2、dup/dup2函数
dup和dup2也是两个非常有用的调用,它们的作用都是用来复制一个文件的描述符。
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
利用函数dup,我们可以复制一个描述符。传给该函数一个既有的描述符,它就会返回一个新的描述符,这个新的描述符是传给它的描述符的拷贝。这意味着,这两个描述符共享同一个数据结构。例如,如果我们对一个文件描述符执行lseek操作,得到的第一个文件的位置和第二个是一样的。下面是用来说明dup函数使用方法的代码片段:
int fd1, fd2; ...
fd2 = dup( fd1 );
需要注意的是,我们可以在调用fork之前建立一个描述符,这与调用dup建立描述符的效果是一样的,子进程也同样会收到一个复制出来的描述符。dup2函数跟dup函数相似,但dup2函数允许调用者规定一个有效描述符和目标描述符的id。dup2和dup的区别就是可以用newfd参数指定新描述符的数值,如果newfd已经打开,则先将其关闭。如果newfd等于oldfd,则dup2返回newfd, 而不关闭它。dup2函数返回的新文件描述符同样与参数oldfd共享同一文件表项。dup2函数成功返回时,目标描述符(dup2函数的第二个参数)将变成源描述符(dup2函数的第一个参数)的复制品,换句话说,两个文件描述符现在都指向同一个文件,并且是函数第一个参数指向的文件。下面我们用一段代码加以说明:
int oldfd;
oldfd = open("app_log", (O_RDWR | O_CREATE), 0644 );
dup2( oldfd, 1 );
close( oldfd );
本例中,我们打开了一个新文件,称为“app_log”,并收到一个文件描述符,该描述符叫做fd1。我们调用dup2函数,参数为oldfd和1,这会导致用我们新打开的文件描述符替换掉由1代表的文件描述符(即stdout,因为标准输出文件的id为1)。任何写到stdout的东西,现在都将改为写入名为“app_log”的文件中。需要注意的是,dup2函数在复制了oldfd之后,会立即将其关闭,但不会关掉新近打开的文件描述符,因为文件描述符1现在也指向它。
原文链接:https://blog.csdn.net/zhouhong1026/article/details/8151235
linux存储--dup和dup2函数解析(十八)相关推荐
- linux文件重定向 dup,linux之dup和dup2函数解析
linux之dup和dup2函数解析 linux之dup和dup2函数解析 系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户 ...
- linux之dup和dup2函数解析
理论介绍: 1. 文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从she ...
- 九、Linux之dup和dup2函数
九.Linux之dup和dup2函数 目录: 九.Linux之dup和dup2函数 一.重定向 二.dup()函数原型(dup--duplicate) int dup(int oldfd); 三.du ...
- linux c——dup( )和dup2( )函数详解
dup()函数和dup2()函数书上在文件操作那一章,已经讲过了,这周看重定向这块,发现它挺重要,就再看了回,记录下. 1. dup函数 头文件及函数定义: #include <unistd.h ...
- Linux的dup与dup2函数
dup函数 函数原型: int dup(int oldfd); 作用: 复制oldfd,返回新的文件描述符,这两个文件描述符执行相同的系统资源,而且新的文件描述符是操作系统给进程分配没有用到的数字最小 ...
- linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2
Linux:dup和dup2文件描述符及函数解析,dupdup2 一.文件描述符 1.1 文件描述符概念 我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符 ...
- dup和dup2函数
dup和dup2函数 dup和dup2用于复制文件描述符,通常用于重定向. #include <unistd.h>int dup(int oldfd); int dup2(int oldf ...
- unix:dup与dup2函数详解
dup操作 功能:复制文件描述符,重定向输入输出. 函数: #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int ...
- Linux运维 第三阶段 (十八) varnish
Linux运维 第三阶段 (十八) varnish 数据: 结构化数据,RDBMS: 非结构化数据,FS,存海量小文件,NAS.SAN.DFS可提供较好的性能: web cache: 程序具有局部性( ...
最新文章
- SQL to Elasticsearch java code
- 一文理解Ranking Loss/Margin Loss/Triplet Loss
- 干货!解读2016-2017全球人工智能技术及产业发展的现状及趋势~
- 《测试驱动开发》学习笔记
- html5 --- 特性检测
- java additem 错,Java错误:IllegalArgumentException:向容器添加窗口
- .net体系结构——C#高级编程第一章
- UVA 10391 STL容器的使用
- router阻止telnet自身的两种方法
- 排序算法之一 冒泡排序(C++版本)
- 帝国cms 自动生成html,帝国cms实现用户访问页面自动生成html的方法
- FPGA 之 SOPC 系列(三)Nios II 体系结构
- Python基础_闭包和迭代器
- Mac下使用Automator实现截屏编辑保存
- Excel中SEARCH函数的使用方法
- 4.外部协作单位的组织与管理
- 网络安全风险感知和发掘,练习题
- 数字逻辑代数基础——基本定理、公式与卡诺图化简法、格雷码、LSFR等
- shell - grep输出的值赋值给变量,shell逻辑非(或者)的判断,和if-else
- python控制excel打印_九、Python 操作excel(一)
热门文章
- python基础教程第三版怎么样-Python基础教程(第三版)(七)再谈抽象
- 自学python需要下载什么软件-学python下载什么软件开发
- python类装饰器详解-Python 类装饰器解析
- python微控制器编程从零开始-单片机可以使用Python语言来控制了!
- 自学python推荐书籍 知乎-你一定不能错过的翻译学习资源!
- python调用shell命令-python中执行shell命令的几个方法小结
- python基本语法语句-Python基本语法,python,基础
- python毕业设计开题报告-基于python爬虫的影评情感分析研究开题报告
- python语音在线编辑-Python如何实现文本转语音
- python降级-关于卸载:如何从Python 3.2降级到2.7?