`

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,是真的关闭了。

分享到:
评论

相关推荐

    Linux内核中的dup系统调用

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

    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进行分析是很有...

    汇编程序设计 汇编

    data2 db 21,0,22 dup('$') ;用于存放第二个字符串 data3 db 21,0,22 dup('$') ;用于存放第三个字符串 data4 db 21,0,22 dup('$') ;用于存放第四个字符串 data5 db 21,0,22 dup('$') ;用于存放第五个字符串 ...

    包过滤防火墙技术即查看包头以决定包的命运

    包过滤功能是内建于核心的(作为一个核心模块,或者直接内建),同时还有一些可以运用于数据包之上的技巧,不过最常用的依然是查看包头以决定包的命运。

    ch4-2-汇编语言程序设计(dos功能调用与程序设计).pptx

    各子功能采用功能号来区分 附录D 系统功能调用的实现 功能调用号 AH 置入口参数 执行 "INT n " 分析出口参数 … … 系统功能调用的一般过程 ch4-2-汇编语言程序设计(dos功能调用与程序设计)全文

    完全掌握加密解密实战超级手册.zip02

    1946.4 制作破解补丁工具 1966.4.1 补丁制作工具dUP 1966.4.2 绿色工具XCell 1996.5 专家点拨:常见问题解答 200第7章 揭秘壳的不同应用技术 2017.1 不同的加壳压缩软件 2027.1.1 DOS窗口下的文件压缩壳软件UPX 2027...

    完全掌握加密解密实战超级手册.z01

    1946.4 制作破解补丁工具 1966.4.1 补丁制作工具dUP 1966.4.2 绿色工具XCell 1996.5 专家点拨:常见问题解答 200第7章 揭秘壳的不同应用技术 2017.1 不同的加壳压缩软件 2027.1.1 DOS窗口下的文件压缩壳软件UPX 2027...

    宋劲彬的嵌入式C语言一站式编程

    3.2. dup和dup2函数 30. 进程 1. 引言 2. 环境变量 3. 进程控制 3.1. fork函数 3.2. exec函数 3.3. wait和waitpid函数 4. 进程间通信 4.1. 管道 4.2. 其它IPC机制 5. 练习:实现简单的Shell 31. Shell脚本 1. Shell...

    微机实验报告.pdf

    加数 DATA2END EQU $-1 SUM DB 5 DUP(?) DATA ENDS STACK SEGMENT STA DB 20 DUP(?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK,ES:DATA START: MOV AX,DATA MOV DS,AX MOV AX,...

    软件工程工资管理系统

    2.需求分析 5 2.1系统需求和功能 5 2.1.2功能需求描述 6 2.1.2.1员工基本信息模块 6 2.1.2.2工资结构设置模块 6 2.1.2.3工资汇总模块 6 2.2数据字典 6 2.2.1数据结构 7 2.2.2数据项 7 2.2.3数据流 8 2.4安全性要求 8...

    Linux C 一站式学习

    3.2. dup和dup2函数 30. 进程 1. 引言 2. 环境变量 3. 进程控制 3.1. fork函数 3.2. exec函数 3.3. wait和waitpid函数 4. 进程间通信 4.1. 管道 4.2. 其它IPC机制 5. 练习:实现简单的Shell 31. Shell脚本 1. Shell...

    linux作业:编写shell程序

    应用UNIX的fork()等系统调用,编写一个c程序具有以下功能: a) 实现Shell的基本功能,包括有:打印提示符;接受和分析命令行(滤去无效的...’并处理之) d)应用 dup(), pipe()系统调用具有输入输出重定向以及管道功能

    【Java】从汇编码分析java对象的创建过程

    0 new #2 3 dup 4 invokespecial #3 7 astore_1 8 return new #2 申请内存,在堆里面创建一个新对象。 半初始化,新建对象中的m值是0。 dup 复制操作,因为invokespecial会消耗一份引用,所以先复制一份 ...

    linux下自己用c语言编写的模拟shell

    1、应用UNIX的fork()等系统调用,编写一个c程序具有以下功能: a) 实现Shell的基本功能,包括有:打印提示符;...’并处理之) d)应用 dup(), pipe()系统调用具有输入输出重定向以及管道功能;

    王爽著《汇编语言》课件及课后习题答案和实验解答

    对关键环节进行深入的剖析。 本书可用作大学计算机专业本科生的汇编教材及希望深入学习计算机科学的读者的自学教材。 【目录信息】 第1章基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 ...

    基于MBC和PO EM特征的人脸识别方法 (2015年)

    针对人脸识别中单一特征难以...所提算法在FERET的Dup1,Dup2,Fb和Fc 4个测试库上取得了较高的识别率,分别为93. 77%,90. 60%,99. 58%和99. 49%;在误识率为0. 1%的条件下,在4个测试库上的认证率分别为95. 70%,92. 31%,9

    电子发声设计实验(1).doc

    时间表 DB 6, 2, 4, 4, 12, 1, 3, 6, 2 DB 4, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 12, 4, 6, 2, 4, 4, 6, 2, 4, 4 DB 6, 2, 4, 4, 12, 4, 6, 2, 4, 4 DB 6, 2, 4, 4, 6, 2, 4, 4, 12 DATA ENDS CODE SEGMENT ASSUME CS:...

    超市管理系统

    table hyspjg add sl decimal(12,3) null,yzxj decimal(12,2) null,hyzxj decimal(12,2) null,zdr char(6) null, zdrq smalldatetime null,zxr char(6) null,zxrq smalldatetime null go create table dbo.sjjhjld ...

    都是想要的考试题 速度下载

    AND BX,0FH MOV [BP+2],BX POP BP MOV CL,4 SHR AX,CL CALL HTOA B1: POP AX B2: ADD AL,30H JL PRT ADD AL,07 PRT: MOV DL,AL MOV AH,2 INT 21H RET HTOA ENDP ...

Global site tag (gtag.js) - Google Analytics