`
kenby
  • 浏览: 723768 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

dup和dup2函数(转)

阅读更多

 

原文url: http://learn.akae.cn/media/ch29s03.html

 

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函数的用法,请结合后面的连环画理解程序的执行过程。

例 29.2. dup和dup2示例程序

#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;
}


图 29.9. dup/dup2示例程序

dup/dup2示例程序


重点解释两个地方:

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

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

 

分享到:
评论

相关推荐

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

    其中,`dup` 和 `dup2` 函数在处理文件描述符时非常有用。本文将深入探讨这两个函数的用途及其工作原理,特别是 `dup2` 的使用场景。 #### 二、文件描述符的概念 在Linux或Unix系统中,每个进程都会有一系列的文件...

    UNIX编程中的dup和dup2说明

    在UNIX 编程中,dup 和 dup2 函数经常用来实现进程间通信,例如在命令行管道中,使用 dup 函数和 dup2 函数来重定向进程的 stdin、stdout 和 stderr,以实现数据的传输和处理。 在命令行管道中, Dup 函数和 dup2 ...

    dup_dup2介绍

    在这个示例中,`open`函数用于打开文件,`write`函数用于向文件写入数据,`dup`和`dup2`则用来管理文件描述符。`dup`创建了与`fd1`相同的新描述符`fd2`,然后`dup2`将`fd1`的值复制到`fd2`,并关闭`fd1`。因此,后续...

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

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

    简要对比C语言中的dup()函数和dup2()函数

    在C语言中,`dup()`和`dup2()`都是用于复制文件描述符的函数,它们在处理进程的I/O操作时非常有用。文件描述符是操作系统分配给打开文件的唯一标识,通过它来读写文件。下面我们将详细介绍这两个函数的工作原理、...

    dup源代码dup

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

    dup2.25内存补丁制作工具

    pcre.dll和BeaEngine.dll等动态链接库文件则提供了必要的函数支持,确保工具的正常运行。 总结起来,"dup2.25内存补丁制作工具"凭借其强大的功能和人性化的界面设计,成为了IT从业者进行软件调试和优化的首选工具。...

    dup2.19.beta

    dup2函数在Linux系统编程中扮演着重要的角色,它是用于重定向或复制文件描述符的核心函数。"dup2.19.beta"可能是指一个实验性的或者测试版本的库或者工具,其中包含了对dup2函数的改进或特定实现。在这个版本中,...

    DUP套接字客户端

    接下来,创建一个UDP套接字,使用`socket`函数指定`AF_INET`(IPv4)和`SOCK_DGRAM`(UDP)。 发送数据时,你需要构造一个`sockaddr_in`结构体,其中包含目标IP地址和端口号。然后,使用`sendto`函数将数据发送到...

    dup2 - FilePlanet_visualc++_

    1. dup2_help.chm:这是一个帮助文件,很可能包含了关于如何使用dup2函数或相关工具的详细信息,包括API文档和使用示例。 2. pcre.dll:这是Perl兼容正则表达式(PCRE)库的动态链接库版本,可能在游戏中用于文本...

    Openssl函数接口介绍

    Openssl 中的复制以及交换函数包括 BN_copy、BN_dup 和 BN_swap。其中,BN_copy 函数用于将一个 BIGNUM 结构复制给另一个,BN_dup 函数用于新建一个 BIGNUM 结构,并将一个 BIGNUM 结构复制给新建结构,BN_swap 函数...

    python函数和函数传参ppt.pptx

    例如,`dup(str, times = 2)`函数中`times`就是一个可选参数,如果不提供,它的默认值为2。可变数量参数则允许函数接收任意数量的参数,这通过在参数前添加星号(*)来实现,如`vfunc(a, *b)`,其中`b`将接收到所有...

    获取DUP Handle 本次是绑定模式

    main函数内 UnitTest_autoRunDemo自动运行 UnitTest_voShowVi(0,0,0,0);决定显示红外还是可见光 Disp_drvStart 使能通道 发送信号 alloc窗口的个数 每个窗口的属性 Disp_drvSetDisp 绑定显示输入源 打印绑定关系 ...

    linux头文件包含的函数

    函数说明:dup2 函数用于复制参数 oldfd 所指的文件描述词,并将它拷贝至参数 newfd 后一块返回。若参数 newfd 为一已打开的文件描述词,则 newfd 所指的文件会先被关闭。 返回值:当复制成功时,则返回最小及尚未...

    c++面试题网络编程篇

    dup函数将一个文件描述符duplicate到一个新的文件描述符上,而dup2函数则可以将一个文件描述符duplicate到指定的文件描述符上。 2. lseek函数 lseek函数用于设置文件的偏移量,off_t lseek(int fd, off_t offset, ...

    linux C语言函数大全

    5. 进程间通信:`pipe`创建管道,`fork`和`dup`实现管道通信,`msg*`、`sem*`和`shm*`系列函数用于消息队列、信号量和共享内存。 6. 系统信息获取:`getpid`获取进程ID,`getppid`获取父进程ID,`getuid`和`geteuid...

Global site tag (gtag.js) - Google Analytics