`
sealbird
  • 浏览: 583884 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

深入理解dup和dup2的用法

 
阅读更多
引用
网上有很多资料详细讲解了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关闭掉,否则会造成打开的文件未关闭。
分享到:
评论
1 楼 ^=^ 2012-05-09  
STDIN_FILENO是unistd.h中定义的一个number而已,怎么能这样用呢?
int* stdinp = STDIN_FILENO
类型都不匹配。

相关推荐

    详细介绍dup2函数用法,一看必懂.。。。

    ### 详细了解 `dup2` 函数用法 #### 一、引言 在进行系统编程时,特别是使用C语言编写CGI(通用网关接口)程序时,掌握文件描述符的操作变得至关重要。其中,`dup` 和 `dup2` 函数在处理文件描述符时非常有用。...

    文件描述符的复制:dup()和dup2()示例代码

    本篇文章将深入探讨如何通过`dup()`和`dup2()`两个系统调用来复制文件描述符,并提供相关示例代码。 `dup()`函数是Linux提供的一个系统调用,它的主要作用是创建一个新的文件描述符,该描述符与已存在的一个文件...

    dUP v2.17 Beta 23

    8. `汉化说明.txt`:详细解释了汉化过程和需要注意的事项,对用户理解汉化版软件的特性和使用方法非常有帮助。 9. `icons`:这是一个文件夹,可能包含软件的各种图标资源。 10. `chiptunes`:可能是一组用于软件界面...

    demo1_FERET_dup1_MBC_O

    学习和理解这个示例,开发者可以深入了解如何将SSA和LBP结合应用到实际的人脸识别问题上。首先,需要读取和预处理FERET数据集中的图像,然后使用SSA进行信号分析和特征提取,接着利用LBP计算图像的局部特征。最后,...

    sevenforths:前进 dup dup dup dup dup dup

    为了深入了解这个项目,我们需要查看源代码、阅读README文件以及任何可能的注释,以了解作者的具体实现和项目目标。同时,理解JavaScript的核心概念,如变量、作用域、原型链、异步编程(回调、Promise、async/await...

    图像匹配;linemod2D;VS2017工程

    2. 提取模板图像的特征,例如关键点和描述符。 3. 对视频流中的每一帧进行预处理,如灰度化和尺度变换。 4. 检测帧中的关键点,计算与模板的关键点匹配。 5. 应用匹配策略,如BFMatcher(Brute Force Matcher)或...

    demo1_FERET_dup1_MBC_A

    总的来说,这个压缩包提供的资源可以帮助我们深入理解并实践基于LBP和SES的人脸识别技术,对于学习计算机视觉和机器学习的开发者来说,是一个非常实用的学习材料。通过运行和分析“demo1_FERET_dup1_MBC_A.m”文件,...

    Demo_MBC_P_dup1

    在IT领域,特别是计算机视觉和图像处理中,"Demo_MBC_P_dup1"这个压缩包文件可能包含了一个演示或实验项目,专注于...如果你打算深入研究这个主题,理解并实践"Demo_MBC_P_dup1"中的内容将有助于你掌握这些核心技术。

    demo1_FERET_dup1_MBC_P

    标题中的"demo1_FERET_dup1_MBC_P"很可能是一个...通过深入理解和应用这些技术,开发者和研究人员可以优化算法,提高人脸识别的准确性和效率,这对于安全监控、移动设备解锁、社交网络身份验证等多个领域都有重要价值。

    大学计算机基础应用习题集.pdf

    《大学计算机基础应用习题集》是一本专为大学生设计的教材补充资料,旨在帮助学生深入理解和掌握计算机基础知识。这份习题集包含了丰富的练习题目,覆盖了计算机科学的基础概念、操作系统、网络技术、编程基础等多个...

    unix环境高级编程英文版第2版.pdf 高清非扫描版

    同时,还探讨了I/O效率、文件共享、原子操作以及dup和dup2函数的使用。文件控制函数fcntl和ioctl的介绍,以及/dev/fd的讨论,为高级文件操作提供了丰富的技术细节。 文件与目录章节涉及了stat、fstat和lstat函数,...

    dupMsg二人聊天工具

    通过阅读源码,可以深入理解如何处理用户输入、响应事件、进行网络通信等基本操作。 6. **代码优化与扩展**:虽然作为新手作品,代码可能较为基础,但可以作为进一步学习和改进的基础。例如,可以添加加密机制以...

    ns2仿真程序源代码

    通过NS2的源代码学习,我们可以深入理解网络模型、协议实现和仿真过程。下面我们将详细探讨这份NS2仿真程序中的主要知识点。 1. **初始化与配置**: - `new Simulator`:创建一个新的模拟器实例,这是NS2仿真过程...

    Mader.摸索出来的dw数值nasm读出使用方法四

    在本文中,我们将深入探讨如何使用Mader分享的“dw数值nasm读出使用方法四”。这个主题聚焦于使用NASM(Netwide Assembler)解释和处理DW(Double Word)指令,这是一种在汇编语言中表示32位整数的方式。在实际的...

    unix环境高级编程第三版随书例子程序

    2. **标准输入输出**:如何重定向标准输入、输出和错误流,以及使用dup和dup2函数创建多个文件描述符指向同一文件或管道。 3. **进程管理**:涵盖fork、exec家族(如execlp、execv、execve等)、waitpid和wait,...

    上机过程及DEBUG命令练习

    上机过程及DEBUG命令练习 ...通过本实验,学生将掌握汇编语言程序的上机过程和DEBUG命令的使用方法,对实验中的每一个步骤都有了深入的理解和掌握,从而提高了学生的实际操作能力和问题解决能力。

    sql删除表中重复记录方法

    以下是对给定文件中四种方法的详细解析和扩展,旨在帮助读者深入理解并掌握这些技巧。 ### 方法一:使用临时表 这种方法通过创建两个临时表来辅助删除重复记录的过程。首先,通过`GROUP BY`和`COUNT(*)`函数找出...

    linux C常用函数用法有例子

    在Linux系统中,C语言是开发底层程序和系统级软件的主要工具。本资源包提供了Linux应用函数的详细信息,包括函数...通过查阅提供的手册,开发者可以深入理解每个函数的工作原理,以及如何在实际项目中正确使用它们。

    汇编第2次上机实验报告

    【汇编语言上机实验报告】 本次实验旨在掌握汇编语言的基本操作,特别是与输入输出...通过这些实践,学生可以更深入地理解汇编语言的原理和实际应用。在完成实验的过程中,需要注意错误检查和调试,确保程序的正确性。

    汇编语言课后习题的答案

    在汇编语言的学习过程中,课后习题是巩固和加深理解的重要环节。...通过深入理解和实践这些知识点,可以更好地掌握汇编语言编程的基础。记住,实践是学习汇编的关键,尝试自己编写和调试代码,才能真正掌握这些概念。

Global site tag (gtag.js) - Google Analytics