深入理解dup和dup2的用法

2023-11-10 16:32
文章标签 深入 理解 用法 dup2 dup

本文主要是介绍深入理解dup和dup2的用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

[quote]网上有很多资料详细讲解了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关闭掉,否则会造成打开的文件未关闭。[/quote]

这篇关于深入理解dup和dup2的用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/383916

相关文章

SQL BETWEEN 语句的基本用法详解

《SQLBETWEEN语句的基本用法详解》SQLBETWEEN语句是一个用于在SQL查询中指定查询条件的重要工具,它允许用户指定一个范围,用于筛选符合特定条件的记录,本文将详细介绍BETWEEN语... 目录概述BETWEEN 语句的基本用法BETWEEN 语句的示例示例 1:查询年龄在 20 到 30 岁

CSS place-items: center解析与用法详解

《CSSplace-items:center解析与用法详解》place-items:center;是一个强大的CSS简写属性,用于同时控制网格(Grid)和弹性盒(Flexbox)... place-items: center; 是一个强大的 css 简写属性,用于同时控制 网格(Grid) 和 弹性盒(F

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

一文深入详解Python的secrets模块

《一文深入详解Python的secrets模块》在构建涉及用户身份认证、权限管理、加密通信等系统时,开发者最不能忽视的一个问题就是“安全性”,Python在3.6版本中引入了专门面向安全用途的secr... 目录引言一、背景与动机:为什么需要 secrets 模块?二、secrets 模块的核心功能1. 基

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1