用指针的观点来深入理解dup和dup2的用法

作者:ejian 2007-09-17

网上有很多资料详细讲解了dup和dup2的用法,有讲得不错的,但总感觉理解起来还是有点困难,通过实践,我发现一种C程序更容易理解的讲解方法-使用类比指针的方法来阐述dup和dup2的用法,可能更容易让人在非常短的时间内接受,下面的内容是我理解dup和dup2用法的总结,希望对dup和dup2存有疑惑的朋友所有帮助。

int* STDIN_FILENO = (int *)0; // 这是一个指向标准输入的指针,由系统预定义,所以可以直接拿来使用

// 下面这句的意思相当于:int* stdinp = STDIN_FILENO,

// 即使用stdinp和STDIN_FILENO指向同一个地方

int* stdinp = dup(STDIN_FILENO);

// 下面创建管道

int fd[2];

pipe(fd);

// 下面这句相当于:

// STDIN_FILENO = fd[0];

// 从这里可以看出STDIN_FILENO和stdinp指向了不同的位置

dup2(fd[0], STDIN_FILENO);

// 在这里可以关闭fd[0],因为我们还可以通过STDIN_FILENO

// 来操作这块内存,原因是STDIN_FILENO和fd[0]是指向同一个地方的

// 所以通常会:

close(fd[0]);

// 以后STDIN_FILENO可以替代fd[0]了,close(fd[0])相当于

// fd[0] = NULL;

// 将fd[0]指向一个有效的安全值,关闭它

// 下面再说说如何恢复:

// 只需要执行:

dup2(stdinp, STDIN_FILENO);

// 这又使用STDIN_FILENO和stdinp指向了相同的地方,由于stdinp实际上是指向最原始的“STDIN_FILENO”的,

// 所以相当于恢复了指向

// 由于STDIN_FILENO和stdinp现在又都指向了相同的地方,所以stdinp已经完成历史使命,这个时候可以关闭它了:

close(stdinp);

// 这个当然相当于:

stdinp = NULL;

至此,dup2&dup2的用法讲完了,不知道大家是否可以理解,但我想从指针的角度来理解应该还是相当容易的,且不

会忘记不容易出错,只要你真正理解了C语言中的指向是啥东西(指向一个内存的东东)。

不过,还有一点要请各位注意,dup和dup2的改变指向时会分配内存,所以在不使用时要记得打开,否则

你可能遇到“打开的文件过多”的错误,比如:

int* stdinp = dup(STDIN_FILENO);

之后,当stdinp完成了它的历史使命之后,应该调用close(stdinp)将stdinp关闭掉,否则会造成打开的文件未关闭。

转载于:https://blog.51cto.com/mooon/909440

用指针的观点来深入理解dup和dup2的用法相关推荐

  1. 浅谈dup和dup2的用法

    https://blog.csdn.net/u012058778/article/details/78705536 一.dup和dup2函数  这两个函数都可以来复制一个现有的文件描述符,他们的声明如 ...

  2. 评价类(观点)题和理解类题目的辨析 区别一:审题干信息和题目要求。

    2020年国考申论备考:评价类(观点)题和理解类题目的辨析 区别一:审题干信息和题目要求. 一个男生和一个女生的区别,从外在生理特征便可以进行区分,这些就是"显性区别".同样,一般 ...

  3. 2020年国考申论备考:评价类(观点)题和理解类题目的辨析

    2020年国考申论备考:评价类(观点)题和理解类题目的辨析 提起申论,很多人对理解类和评价类这两种题型会感到头疼,一方面是材料相对较为分散.复杂,另一方面就是答题逻辑和答案的梳理也比较繁琐.甚至有时候 ...

  4. 指针,指针变量,指针变量指向的一些理解

    对于指针,指针变量,指针变量(通常简写成指针)指向的一些理解 1.指针的定义: 首先假设有一个内存单元,每一个内存单元对应着一个相应的编号,即为该内存单元的地址,该地址也就是我们所说的指针. 2.指针 ...

  5. c语言指针与数组的深入理解

    引言:本篇再一次写到指针,学过c语言的都知道,指针是初学c语言时候遇到的一个比较难搞的知识点.你尽管可以想的简单,但是其实如果去用的话,没有一个更加深入的理解,那么后续的学习到数据结构就会艰难无比. ...

  6. Linux文件,文件描述符以及dup()和dup2()

    一.Linux中文件 可以分为4种:普通文件.目录文件.链接文件和设备文件. 1.普通文件 是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据. ls -lh 来查 ...

  7. linux之dup和dup2函数解析

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

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

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

  9. dup/dup2的用法及详解(转)

    相信大部分在Unix/Linux下编程的程序员手头上都有<Unix环境高级编程>(APUE)这本超级经典巨著.作者在该书中讲解dup/dup2之前曾经讲过"文件共享", ...

最新文章

  1. 【机器视觉案例】(11) 眨眼计数器,人脸关键点检测,附python完整代码
  2. 揭秘深度强化学习的研究哲学:乐观主义与悲观主义
  3. Android API 中文 (52) —— ZoomButtonsController.OnZoomListener
  4. 页码太靠上怎么办_有些宝宝到了二岁不会说话怎么办
  5. 网络爬虫--25.【selenium实战】实现拉勾网爬虫之--selenium获取数据
  6. java get null_java 获取对象中为null的字段实例代码
  7. Spring模块介绍
  8. C标准函数库中获取时间与日期、对时间与日期数据操作及格式化
  9. java 线程 wait 一定要同步_java中使用wait就得使用同步锁,而且2个线程必须都使用同步代码块,否则就会异常...
  10. c++中*是什么意思_int在python中什么意思
  11. Android LiveData组件分析
  12. 关闭Dynamipsgui的自动更新
  13. 2022天府杯国际赛数学建模题目和思路
  14. Xcopy 复制文件和目录,包括子目录。
  15. 绘制正态分布概率密度函数
  16. nginx 配置之 proxy_pass参数详解
  17. 【uiautomation】微信好友昵称及备注获取(存储到excel中)
  18. 倍福PLC Modbus通信区
  19. vb.netserialport数据接收不完整_北斗三号观测数据质量分析
  20. 卡巴斯基KAV/KIS 6.0/7.0 授权许可文件永久免费更新方法

热门文章

  1. web socket 心跳包的实现方案
  2. 第五章(5)Libgdx应用框架之线程
  3. 随机生成十六进制颜色
  4. php 回复可见,Typecho完美实现回复可见功能
  5. java 向量上的坐标点_新高三知识点-点的平移公式
  6. 5G NGC — PCF 策略控制功能
  7. hiredis — Redis 的 C 语言客户端
  8. 5G 标准 — R15
  9. NR 5G UE初始接入流程
  10. 79-定义不同颜色字体