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函数解析(十八)相关推荐

  1. linux文件重定向 dup,linux之dup和dup2函数解析

    linux之dup和dup2函数解析 linux之dup和dup2函数解析 系统调用dup和dup2能够复制文件描述符.dup返回新的文件文件描述符(没有用的文件描述符最小的编号).dup2可以让用户 ...

  2. linux之dup和dup2函数解析

    理论介绍: 1. 文件描述符在内核中数据结构 在具体说dup/dup2之前,我认为有必要先了解一下文件描述符在内核中的形态.一个进程在此存在期间,会有一些文件被打开,从而会返回一些文件描述符,从she ...

  3. 九、Linux之dup和dup2函数

    九.Linux之dup和dup2函数 目录: 九.Linux之dup和dup2函数 一.重定向 二.dup()函数原型(dup--duplicate) int dup(int oldfd); 三.du ...

  4. linux c——dup( )和dup2( )函数详解

    dup()函数和dup2()函数书上在文件操作那一章,已经讲过了,这周看重定向这块,发现它挺重要,就再看了回,记录下. 1. dup函数 头文件及函数定义: #include <unistd.h ...

  5. Linux的dup与dup2函数

    dup函数 函数原型: int dup(int oldfd); 作用: 复制oldfd,返回新的文件描述符,这两个文件描述符执行相同的系统资源,而且新的文件描述符是操作系统给进程分配没有用到的数字最小 ...

  6. linux dup用法,Linux:dup和dup2文件描述符及函数解析,dupdup2

    Linux:dup和dup2文件描述符及函数解析,dupdup2 一.文件描述符 1.1 文件描述符概念 我们知道在Linux下一切皆文件,因此我们需要一个东西对这些文件进行管理,此时就需要文件描述符 ...

  7. dup和dup2函数

    dup和dup2函数 dup和dup2用于复制文件描述符,通常用于重定向. #include <unistd.h>int dup(int oldfd); int dup2(int oldf ...

  8. unix:dup与dup2函数详解

    dup操作 功能:复制文件描述符,重定向输入输出. 函数: #include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int ...

  9. Linux运维 第三阶段 (十八) varnish

    Linux运维 第三阶段 (十八) varnish 数据: 结构化数据,RDBMS: 非结构化数据,FS,存海量小文件,NAS.SAN.DFS可提供较好的性能: web cache: 程序具有局部性( ...

最新文章

  1. SQL to Elasticsearch java code
  2. 一文理解Ranking Loss/Margin Loss/Triplet Loss
  3. 干货!解读2016-2017全球人工智能技术及产业发展的现状及趋势~
  4. 《测试驱动开发》学习笔记
  5. html5 --- 特性检测
  6. java additem 错,Java错误:IllegalArgumentException:向容器添加窗口
  7. .net体系结构——C#高级编程第一章
  8. UVA 10391 STL容器的使用
  9. router阻止telnet自身的两种方法
  10. 排序算法之一 冒泡排序(C++版本)
  11. 帝国cms 自动生成html,帝国cms实现用户访问页面自动生成html的方法
  12. FPGA 之 SOPC 系列(三)Nios II 体系结构
  13. Python基础_闭包和迭代器
  14. Mac下使用Automator实现截屏编辑保存
  15. Excel中SEARCH函数的使用方法
  16. 4.外部协作单位的组织与管理
  17. 网络安全风险感知和发掘,练习题
  18. 数字逻辑代数基础——基本定理、公式与卡诺图化简法、格雷码、LSFR等
  19. shell - grep输出的值赋值给变量,shell逻辑非(或者)的判断,和if-else
  20. python控制excel打印_九、Python 操作excel(一)

热门文章

  1. python基础教程第三版怎么样-Python基础教程(第三版)(七)再谈抽象
  2. 自学python需要下载什么软件-学python下载什么软件开发
  3. python类装饰器详解-Python 类装饰器解析
  4. python微控制器编程从零开始-单片机可以使用Python语言来控制了!
  5. 自学python推荐书籍 知乎-你一定不能错过的翻译学习资源!
  6. python调用shell命令-python中执行shell命令的几个方法小结
  7. python基本语法语句-Python基本语法,python,基础
  8. python毕业设计开题报告-基于python爬虫的影评情感分析研究开题报告
  9. python语音在线编辑-Python如何实现文本转语音
  10. python降级-关于卸载:如何从Python 3.2降级到2.7?