`
tcspecial
  • 浏览: 908009 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

dup,dup2用法

阅读更多

   dup,dup2,dup3是linux下非常重要的函数,用来实现流的重定向,可以很方便实现一些很有趣的效果。

   原理:每个进程在内核中有相应的fd记录表,每个fd占用一项。调用dup()后,新产生的newfd与原oldfd指向同一内核文件表项,操作newfd与操作oldfd效果一样,比较常用的应用就是CGI编程。

   详细描述见:http://www.cnblogs.com/GODYCA/archive/2013/01/05/2846197.html

 

   下面看代码:

 

int main(int argc,char **argv)
{
	// 打开文件
	int fd = open("data.dat",O_CREAT|O_RDWR|O_TRUNC,S_IRUSR|S_IWUSR);
	assert(fd>0);

	// 通过新fd写文件
	read_write(fd);
	
	// dup实现标准输入重定向到文件 
	print2file(fd);

	// dup2实现标准输入重定向到文件
	print2file1(fd);
	
	return 0;
}

void read_write(int fd)
{
	// 拷贝fd,返回当前系统最小且没有被使用的fd
	int nfd = dup(fd);
	printf("old:%d new:%d\n",fd,nfd); // 3 4

	char buf[1024];
	memset(buf,'\0',1024);

	int n;

	// 读取控制台输入流,并通过nfd写入文件
	while((n = read(STDIN_FILENO,buf,1024))>0)
	{
		write(nfd,buf,n);
	}
}

void print2file(int fd)
{
	close(STDOUT_FILENO);

	/**
	 * 关闭标准输出流,调用dup()后返回的系统最小可用fd,此时nfd=1。此时任何目标为STDOUT_FILENO的I/O操作,如printf()等数据都会流入fd对应的文件,太神奇了。
	 * 如果fd为tcp套接字描述符,则会被发送到与客户端连接的socket上,这就是CGI的实现原理。这就能解释CGI程序中大量的printf()语句
	 */
	int nfd = dup(fd);

	// 这两条打印语句会被写入data.dat文件中
	printf("old:%d new:%d\n",fd,nfd);
	printf("hello world\n");
}

void print2file1(int fd)
{
	/**
	 * dup2可以指定拷贝后的newfd,原先的newfd会被关闭
	 * dup2(fd,STDOUT_FILENO); 相当于 cose(STDOUT_FILENO); dup(fd); 
	 */
	int nfd = dup2(fd,STDOUT_FILENO);
	printf("old:%d new:%d\n",fd,nfd);
	printf("dup2 test\n");
}

 

 

分享到:
评论

相关推荐

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

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

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

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

    dup 补丁 2.2汉化版

    1. **dup2_help.chm**:这是补丁的帮助文件,以CHM( Compiled HTML Help)格式存在,通常包含了详细的操作指南和使用方法,用户可以通过查阅此文件了解如何使用补丁以及各项功能的具体用途。 2. **DisasmEngineDLL...

    dup源代码dup

    dup函数在系统编写程序的用法 及源代码

    dUP v2.17 Beta 23

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

    Test_dup2_x2.rar_android

    `Test_dup2_x2.rar_android`这个压缩包可能包含了一组用于测试特定功能的代码,尤其是与数据库操作相关的部分,因为"Cursor Wrapper Test"通常涉及到对SQLite数据库查询结果的封装和测试。下面我们将深入探讨这些...

    diablo2oo2's Universal Patcher(DUP) v2.26.1 汉化版.rar

    本文将详细解析DUP的功能、使用方法以及汉化版的特点。 1. DUP的核心功能: DUP的主要功能是对《暗黑破坏神2》的游戏文件进行修改和优化,包括但不限于修复错误、提升游戏性能、添加自定义内容等。它利用了PCRE...

    Dup-Pack:基于CRIS的FPGA装箱方法.pdf

    本文所介绍的Dup-Pack方法,是基于CRIS(电路改写指令系统)的一种FPGA装箱方法,通过这种方式可以有效优化FPGA芯片的使用。 FPGA(现场可编程门阵列)是一种可以通过软件编程来配置的数字集成电路。与传统的集成电路...

    Test_dup_x2.rar_The Test

    在"Test_dup_x2"这个测试环境中,开发者可能使用诸如CUnit这样的单元测试框架,编写测试用例来检查适配器的功能。测试用例应包括正常情况、边界条件和异常情况,以全面验证适配器的健壮性。 总的来说,"Test_dup_x2...

    java虚拟机指令dup详解

    在 Java 中,dup 指令的使用非常频繁,例如在创建异常对象时,需要使用 dup 指令来复制对象的引用,以便将其传递给实例初始化方法。在创建集合对象时,dup 指令也可以用于复制集合的引用,以便将其传递给相关的方法...

    ha_dup2.09.

    "dup2_HH.exe" 可能是该软件的主执行文件,"dup2.ini" 可能包含了软件的配置设置,而 "Readme.txt" 通常会提供安装或使用的说明。"skins" 文件夹可能包含了用户界面的皮肤,允许用户自定义软件的外观,提高使用体验...

    demo1_FERET_dup1_MBC_O

    标题中的“demo1_FERET_dup1_MBC_O”很可能是一个示例程序或者数据集,用于演示人脸识别技术,特别是基于单演信号(Singular Spectrum Analysis, SSA)和局部二值模式(Local Binary Patterns, LBP)的方法。...

    mruby-io-dup2:IO.dup2用于mruby

    在mruby中,`IO.dup2`方法是一个关键操作,用于文件描述符的复制。 `IO.dup2`方法在C语言环境中尤其重要,因为它允许开发者在系统级别的I/O操作中复用和重定向文件描述符。在操作系统中,每个打开的文件或I/O流都...

    sevenforths:前进 dup dup dup dup dup dup

    例如,他们可能利用了JavaScript的`Object.assign()`方法进行对象复制,或者使用`Array.prototype.slice()`和`concat()`方法来复制数组。此外,`Function.prototype.call()`和`.apply()`也可以用于函数的重复调用。 ...

    图像匹配;linemod2D;VS2017工程

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

    2018--Find-Dup-File,重复文件查找工具

    使用"Find-Dup-File",开发者可以快速定位并清理这些冗余文件,保持工作环境的整洁,同时也节省了宝贵的硬盘资源。 此外,"Find-Dup-File"还具备一定的自定义能力。用户可以根据自己的需求设置扫描规则,比如只检查...

    fatal: open /dev/null or dup failed: No such file or directory 修复

    使用git Bash here闪退并生成mintty.exe.stackdump文件 cmd使用git 报错 fatal:open /dev/null or dup failed: No such file or directory 并弹出mitty.dump文件 使用方法见我的CSDN

    find_dup_1.zip_Duplicate Text

    它使用了一种名为`find_dup.awk`的Awk脚本来查找和处理文本文件中重复的行。Awk是一种强大的文本分析工具,尤其适用于处理结构化数据,如CSV或TSV文件。 首先,我们需要理解`find_dup.awk`脚本的工作原理。在Awk中...

    Demo_MBC_P_dup1

    **单演信号分析(Singular Spectrum Analysis, SSA)**是一种非线性时间序列分析方法,源自统计力学和随机过程理论。它主要用于发现数据中的周期性和趋势,以及识别和提取隐藏在复杂噪声中的结构和模式。在人脸识别...

    demo1_FERET_dup1_MBC_A

    标题“demo1_FERET_dup1_MBC_A”暗示了一个示例程序或数据集,它可能涉及面部识别技术,特别是使用“单演信号”(Single Exponential Signal, SES)和“局部二值模式”(Local Binary Patterns, LBP)的方法。...

Global site tag (gtag.js) - Google Analytics