`

dup and dup2的剖析

 
阅读更多

dupdup2都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个file结构体。如果两个文件描述符指向同一个file结构体,File Status Flag和读写位置只保存一份在file结构体中,并且file结构体的引用计数是2。如果两次open同一文件得到两个文件描述符,则每个描述符对应一个不同的file结构体,可以有不同的File Status Flag和读写位置。请注意区分这两种情况。

#include <unistd.h>

int dup(int oldfd);
int dup2(int oldfd, int newfd);

如果调用成功,这两个函数都返回新分配或指定的文件描述符,如果出错则返回-1。dup返回的新文件描述符一定该进程未使用的最小文件描述符,这一点和open类似。dup2可以用newfd参数指定新描述符的数值。如果newfd当前已经打开,则先将其关闭再做dup2操作,如果oldfd等于newfd,则dup2直接返回newfd而不用先关闭newfd再复制。

下面这个例子演示了dupdup2函数的用法,请结合后面的连环画理解程序的执行过程。


#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
int main(void)
{
	int fd, save_fd;
	char msg[] = "This is a test\n";

	fd = open("somefile", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR);
	if(fd<0) {
		perror("open");
		exit(1);
	}
	save_fd = dup(STDOUT_FILENO);
	dup2(fd, STDOUT_FILENO);
	close(fd);
	write(STDOUT_FILENO, msg, strlen(msg));
	dup2(save_fd, STDOUT_FILENO);
	write(STDOUT_FILENO, msg, strlen(msg));
	close(save_fd);
	return 0;
}
 
 

重点解释两个地方:

  • 第3幅图,要执行dup2(fd, 1);,文件描述符1原本指向tty,现在要指向新的文件somefile,就把原来的关闭了,但是tty这个文件原本有两个引用计数,还有文件描述符save_fd也指向它,所以只是将引用计数减1,并不真的关闭文件。

  • 第5幅图,要执行dup2(save_fd, 1);,文件描述符1原本指向somefile,现在要指向新的文件tty,就把原来的关闭了,somefile原本只有一个引用计数,所以这次减到0,是真的关闭了。

分享到:
评论

相关推荐

    DUP2.C

    在阅读和分析DUP2.C文件时,程序员需要对C语言标准库的架构有所了解,包括如何在不同层次上实现系统调用,以及系统调用与操作系统的内核如何交互。此外,理解文件描述符的实现细节、错误处理机制、以及文件描述符的...

    dup 补丁 2.2汉化版

    2. **DisasmEngineDLL.dll**:这是一个动态链接库文件,可能用于补丁的反汇编引擎,用于分析和修改游戏的代码,实现补丁的各种功能。 3. **lang_english.dll** 和 **lang_chs.dll**:这是两种语言的接口文件,分别...

    dUP v2.17 Beta 23

    6. `diablo2oo2's.wildcard.rules.ini`:一个配置文件,可能包含dUP的规则或过滤条件,以适应特定的更新场景。 7. `readme.txt`:标准的文本文件,通常包含关于软件的重要信息、安装指南或更新日志。 8. `汉化说明....

    DUP 2.1 补丁编写工具

    【DUP 2.1 补丁编写工具】是一款专为IT专业人士设计的高效、易用的补丁...无论是日常的软件维护,还是深入的程序分析,它都能提供强大而灵活的支持。使用这款工具,可以大大提高工作效率,降低软件更新和维护的成本。

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

    《Diablo2oo2's Universal Patcher (DUP) v2.26.1 汉化版详解》 Diablo2oo2's Universal Patcher(简称DUP)是一款专为游戏《暗黑破坏神2》(Diablo II)设计的多用途补丁工具,由知名游戏爱好者diablo2oo2开发。此...

    dup2 - FilePlanet_visualc++_

    标题中的"dup2"是一个Unix/Linux系统调用,它允许一个已存在的文件描述符(file descriptor)替换另一个文件描述符。在Windows环境下,这个概念可能不太常见,因为它的API更倾向于使用函数如CreateFile和CloseHandle...

    demo1_FERET_dup1_MBC_O

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

    Linux内核中的dup系统调用

    sys_dup()的主要工作是用来“复制”一个打开的文件号,并使两个文件号都指向同一个文件,下面我们来分析一下它的代码。  1、sys_dup源码分析 asmlinkage long sys_dup(unsigned int fildes)//sys_dup函数的参数...

    sevenforths:前进 dup dup dup dup dup dup

    标题“sevenforths:前进 dup dup dup dup dup dup”似乎是指一个项目或程序,它可能包含重复执行某个操作的元素,这里的“dup”可能代表重复(duplicate)或者数据复制。结合描述“七度 一个节目的故事,分为七个...

    DUP.C

    C标准库源码是学习C语言和底层系统编程不可或缺的资源,通过研究和分析这些源码,程序员可以深入理解C语言的运行原理以及操作系统提供的底层服务。DUP.C作为其中的一份子,它不仅仅是一段可以执行的代码,更是展现...

    Test_dup.rar_out

    在IT行业中,数组是编程语言中最基本的数据结构之一,...对于“Test_dup.rar_out”这个问题,我们需要分析源代码,尤其是两个测试类中的数组操作,找出引发异常的原因,并修复相应的问题,以确保程序的稳定性和可靠性。

    find_dup_1.zip_Duplicate Text

    "find_dup_1.zip_Duplicate Text"这个项目就是针对这个问题的一个实例。它使用了一种名为`find_dup.awk`的Awk脚本来查找和处理文本文件中重复的行。Awk是一种强大的文本分析工具,尤其适用于处理结构化数据,如CSV或...

    Demo_MBC_O_dup

    标题中的“Demo_MBC_O_dup”可能是指一个演示项目或示例代码库,专注于“单演信号”(Monogenic Signal)和“局部二值模式”(Local Binary Patterns, LBP)在人脸识别领域的应用。这些技术在计算机视觉和图像处理...

    Demo_MBC_A_dup

    在IT领域,特别是计算机视觉和图像处理中,"Demo_MBC_A_dup"这个标题暗示了我们正在探讨一种可能的演示或实例,它涉及到单演信号(Morphological Binary Components,MBC)和局部二值模式(Local Binary Patterns,...

    Demo_MBC_P_dup1

    2. **预处理**:可能涉及到图像灰度化、归一化、降噪等步骤,以优化LBP特征提取的效果。 3. **LBP特征提取**:每个面部图像会被转换为LBP特征向量,这些向量包含了图像的纹理信息。 4. **SSA应用**:可能对LBP特征...

    Dup常系数线性齐次微分方程PPT学习教案.pptx

    总之,Dup常系数线性齐次微分方程的学习涉及到特征方程的求解、根的性质分析以及通解的构建,这些知识对于理解和解决涉及动态系统的物理和工程问题至关重要。通过PPT中的例子和练习,学生能够深化对这一主题的理解,...

    demo1_FERET_dup1_MBC_A

    标题“demo1_FERET_dup1_MBC_A”暗示了一个示例程序或数据集,它可能涉及面部识别技术,特别是使用...通过运行和分析“demo1_FERET_dup1_MBC_A.m”文件,我们可以更直观地了解这两种技术在实际应用中的工作原理和效果。

    demo1_FERET_dup1_MBC_P

    单演信号(SER)是一种时间序列分析方法,特别适用于非线性、非平稳信号的表示。在人脸识别中,它能有效捕捉面部表情的变化,通过将面部图像转化为单演域的表示,可以降低噪声影响,提高识别的稳定性和准确性。具体...

    NS-2版本TCP源码分析

    NS-2版本TCP源码分析 NS-2下的TCP和TCP Reno模块分析 3.3 NS-2下的TCP Reno模块分析 根据前面的分析,TCP Veno是在TCP Reno上做了一些修改的。在NS-2上,也沿用了TCP Reno的一些算法。因此,对Reno进行分析是很有...

    03 - Algorithm Analysis.pptx

    在讨论`dup1`和`dup2`时,可以看到`dup1`的比较操作在最坏情况下是`O(N^2)`,而`dup2`是线性的。虽然在某些特定情况下,如数组只有两个元素且它们是重复的,`dup1`可能只需要两次比较,但渐进分析并不关注这些特殊...

Global site tag (gtag.js) - Google Analytics