引用
网上有很多资料详细讲解了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关闭掉,否则会造成打开的文件未关闭。
分享到:
相关推荐
### 详细了解 `dup2` 函数用法 #### 一、引言 在进行系统编程时,特别是使用C语言编写CGI(通用网关接口)程序时,掌握文件描述符的操作变得至关重要。其中,`dup` 和 `dup2` 函数在处理文件描述符时非常有用。...
本篇文章将深入探讨如何通过`dup()`和`dup2()`两个系统调用来复制文件描述符,并提供相关示例代码。 `dup()`函数是Linux提供的一个系统调用,它的主要作用是创建一个新的文件描述符,该描述符与已存在的一个文件...
8. `汉化说明.txt`:详细解释了汉化过程和需要注意的事项,对用户理解汉化版软件的特性和使用方法非常有帮助。 9. `icons`:这是一个文件夹,可能包含软件的各种图标资源。 10. `chiptunes`:可能是一组用于软件界面...
学习和理解这个示例,开发者可以深入了解如何将SSA和LBP结合应用到实际的人脸识别问题上。首先,需要读取和预处理FERET数据集中的图像,然后使用SSA进行信号分析和特征提取,接着利用LBP计算图像的局部特征。最后,...
为了深入了解这个项目,我们需要查看源代码、阅读README文件以及任何可能的注释,以了解作者的具体实现和项目目标。同时,理解JavaScript的核心概念,如变量、作用域、原型链、异步编程(回调、Promise、async/await...
2. 提取模板图像的特征,例如关键点和描述符。 3. 对视频流中的每一帧进行预处理,如灰度化和尺度变换。 4. 检测帧中的关键点,计算与模板的关键点匹配。 5. 应用匹配策略,如BFMatcher(Brute Force Matcher)或...
总的来说,这个压缩包提供的资源可以帮助我们深入理解并实践基于LBP和SES的人脸识别技术,对于学习计算机视觉和机器学习的开发者来说,是一个非常实用的学习材料。通过运行和分析“demo1_FERET_dup1_MBC_A.m”文件,...
在IT领域,特别是计算机视觉和图像处理中,"Demo_MBC_P_dup1"这个压缩包文件可能包含了一个演示或实验项目,专注于...如果你打算深入研究这个主题,理解并实践"Demo_MBC_P_dup1"中的内容将有助于你掌握这些核心技术。
标题中的"demo1_FERET_dup1_MBC_P"很可能是一个...通过深入理解和应用这些技术,开发者和研究人员可以优化算法,提高人脸识别的准确性和效率,这对于安全监控、移动设备解锁、社交网络身份验证等多个领域都有重要价值。
《大学计算机基础应用习题集》是一本专为大学生设计的教材补充资料,旨在帮助学生深入理解和掌握计算机基础知识。这份习题集包含了丰富的练习题目,覆盖了计算机科学的基础概念、操作系统、网络技术、编程基础等多个...
同时,还探讨了I/O效率、文件共享、原子操作以及dup和dup2函数的使用。文件控制函数fcntl和ioctl的介绍,以及/dev/fd的讨论,为高级文件操作提供了丰富的技术细节。 文件与目录章节涉及了stat、fstat和lstat函数,...
通过阅读源码,可以深入理解如何处理用户输入、响应事件、进行网络通信等基本操作。 6. **代码优化与扩展**:虽然作为新手作品,代码可能较为基础,但可以作为进一步学习和改进的基础。例如,可以添加加密机制以...
通过NS2的源代码学习,我们可以深入理解网络模型、协议实现和仿真过程。下面我们将详细探讨这份NS2仿真程序中的主要知识点。 1. **初始化与配置**: - `new Simulator`:创建一个新的模拟器实例,这是NS2仿真过程...
在本文中,我们将深入探讨如何使用Mader分享的“dw数值nasm读出使用方法四”。这个主题聚焦于使用NASM(Netwide Assembler)解释和处理DW(Double Word)指令,这是一种在汇编语言中表示32位整数的方式。在实际的...
2. **标准输入输出**:如何重定向标准输入、输出和错误流,以及使用dup和dup2函数创建多个文件描述符指向同一文件或管道。 3. **进程管理**:涵盖fork、exec家族(如execlp、execv、execve等)、waitpid和wait,...
上机过程及DEBUG命令练习 ...通过本实验,学生将掌握汇编语言程序的上机过程和DEBUG命令的使用方法,对实验中的每一个步骤都有了深入的理解和掌握,从而提高了学生的实际操作能力和问题解决能力。
以下是对给定文件中四种方法的详细解析和扩展,旨在帮助读者深入理解并掌握这些技巧。 ### 方法一:使用临时表 这种方法通过创建两个临时表来辅助删除重复记录的过程。首先,通过`GROUP BY`和`COUNT(*)`函数找出...
在Linux系统中,C语言是开发底层程序和系统级软件的主要工具。本资源包提供了Linux应用函数的详细信息,包括函数...通过查阅提供的手册,开发者可以深入理解每个函数的工作原理,以及如何在实际项目中正确使用它们。
【汇编语言上机实验报告】 本次实验旨在掌握汇编语言的基本操作,特别是与输入输出...通过这些实践,学生可以更深入地理解汇编语言的原理和实际应用。在完成实验的过程中,需要注意错误检查和调试,确保程序的正确性。
在汇编语言的学习过程中,课后习题是巩固和加深理解的重要环节。...通过深入理解和实践这些知识点,可以更好地掌握汇编语言编程的基础。记住,实践是学习汇编的关键,尝试自己编写和调试代码,才能真正掌握这些概念。