深入理解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

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Python itertools中accumulate函数用法及使用运用详细讲解

《Pythonitertools中accumulate函数用法及使用运用详细讲解》:本文主要介绍Python的itertools库中的accumulate函数,该函数可以计算累积和或通过指定函数... 目录1.1前言:1.2定义:1.3衍生用法:1.3Leetcode的实际运用:总结 1.1前言:本文将详

MyBatis-Flex BaseMapper的接口基本用法小结

《MyBatis-FlexBaseMapper的接口基本用法小结》本文主要介绍了MyBatis-FlexBaseMapper的接口基本用法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具... 目录MyBATis-Flex简单介绍特性基础方法INSERT① insert② insertSelec

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

数据库使用之union、union all、各种join的用法区别解析

《数据库使用之union、unionall、各种join的用法区别解析》:本文主要介绍SQL中的Union和UnionAll的区别,包括去重与否以及使用时的注意事项,还详细解释了Join关键字,... 目录一、Union 和Union All1、区别:2、注意点:3、具体举例二、Join关键字的区别&php

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

一文带你理解Python中import机制与importlib的妙用

《一文带你理解Python中import机制与importlib的妙用》在Python编程的世界里,import语句是开发者最常用的工具之一,它就像一把钥匙,打开了通往各种功能和库的大门,下面就跟随小... 目录一、python import机制概述1.1 import语句的基本用法1.2 模块缓存机制1.

深入理解C语言的void*

《深入理解C语言的void*》本文主要介绍了C语言的void*,包括它的任意性、编译器对void*的类型检查以及需要显式类型转换的规则,具有一定的参考价值,感兴趣的可以了解一下... 目录一、void* 的类型任意性二、编译器对 void* 的类型检查三、需要显式类型转换占用的字节四、总结一、void* 的

深入理解Redis大key的危害及解决方案

《深入理解Redis大key的危害及解决方案》本文主要介绍了深入理解Redis大key的危害及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着... 目录一、背景二、什么是大key三、大key评价标准四、大key 产生的原因与场景五、大key影响与危

oracle中exists和not exists用法举例详解

《oracle中exists和notexists用法举例详解》:本文主要介绍oracle中exists和notexists用法的相关资料,EXISTS用于检测子查询是否返回任何行,而NOTE... 目录基本概念:举例语法pub_name总结 exists (sql 返回结果集为真)not exists (s