原文url: http://learn.akae.cn/media/ch29s03.html
dup
和dup2
都可用来复制一个现存的文件描述符,使两个文件描述符指向同一个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
再复制。
下面这个例子演示了dup
和dup2
函数的用法,请结合后面的连环画理解程序的执行过程。
例 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;
}
重点解释两个地方:
-
第3幅图,要执行dup2(fd, 1);
,文件描述符1原本指向tty
,现在要指向新的文件somefile
,就把原来的关闭了,但是tty
这个文件原本有两个引用计数,还有文件描述符save_fd
也指向它,所以只是将引用计数减1,并不真的关闭文件。
-
第5幅图,要执行dup2(save_fd, 1);
,文件描述符1原本指向somefile
,现在要指向新的文件tty
,就把原来的关闭了,somefile
原本只有一个引用计数,所以这次减到0,是真的关闭了。
分享到:
相关推荐
其中,`dup` 和 `dup2` 函数在处理文件描述符时非常有用。本文将深入探讨这两个函数的用途及其工作原理,特别是 `dup2` 的使用场景。 #### 二、文件描述符的概念 在Linux或Unix系统中,每个进程都会有一系列的文件...
在UNIX 编程中,dup 和 dup2 函数经常用来实现进程间通信,例如在命令行管道中,使用 dup 函数和 dup2 函数来重定向进程的 stdin、stdout 和 stderr,以实现数据的传输和处理。 在命令行管道中, Dup 函数和 dup2 ...
在这个示例中,`open`函数用于打开文件,`write`函数用于向文件写入数据,`dup`和`dup2`则用来管理文件描述符。`dup`创建了与`fd1`相同的新描述符`fd2`,然后`dup2`将`fd1`的值复制到`fd2`,并关闭`fd1`。因此,后续...
本篇文章将深入探讨如何通过`dup()`和`dup2()`两个系统调用来复制文件描述符,并提供相关示例代码。 `dup()`函数是Linux提供的一个系统调用,它的主要作用是创建一个新的文件描述符,该描述符与已存在的一个文件...
在C语言中,`dup()`和`dup2()`都是用于复制文件描述符的函数,它们在处理进程的I/O操作时非常有用。文件描述符是操作系统分配给打开文件的唯一标识,通过它来读写文件。下面我们将详细介绍这两个函数的工作原理、...
dup函数在系统编写程序的用法 及源代码
pcre.dll和BeaEngine.dll等动态链接库文件则提供了必要的函数支持,确保工具的正常运行。 总结起来,"dup2.25内存补丁制作工具"凭借其强大的功能和人性化的界面设计,成为了IT从业者进行软件调试和优化的首选工具。...
dup2函数在Linux系统编程中扮演着重要的角色,它是用于重定向或复制文件描述符的核心函数。"dup2.19.beta"可能是指一个实验性的或者测试版本的库或者工具,其中包含了对dup2函数的改进或特定实现。在这个版本中,...
接下来,创建一个UDP套接字,使用`socket`函数指定`AF_INET`(IPv4)和`SOCK_DGRAM`(UDP)。 发送数据时,你需要构造一个`sockaddr_in`结构体,其中包含目标IP地址和端口号。然后,使用`sendto`函数将数据发送到...
1. dup2_help.chm:这是一个帮助文件,很可能包含了关于如何使用dup2函数或相关工具的详细信息,包括API文档和使用示例。 2. pcre.dll:这是Perl兼容正则表达式(PCRE)库的动态链接库版本,可能在游戏中用于文本...
Openssl 中的复制以及交换函数包括 BN_copy、BN_dup 和 BN_swap。其中,BN_copy 函数用于将一个 BIGNUM 结构复制给另一个,BN_dup 函数用于新建一个 BIGNUM 结构,并将一个 BIGNUM 结构复制给新建结构,BN_swap 函数...
例如,`dup(str, times = 2)`函数中`times`就是一个可选参数,如果不提供,它的默认值为2。可变数量参数则允许函数接收任意数量的参数,这通过在参数前添加星号(*)来实现,如`vfunc(a, *b)`,其中`b`将接收到所有...
main函数内 UnitTest_autoRunDemo自动运行 UnitTest_voShowVi(0,0,0,0);决定显示红外还是可见光 Disp_drvStart 使能通道 发送信号 alloc窗口的个数 每个窗口的属性 Disp_drvSetDisp 绑定显示输入源 打印绑定关系 ...
dup函数将一个文件描述符duplicate到一个新的文件描述符上,而dup2函数则可以将一个文件描述符duplicate到指定的文件描述符上。 2. lseek函数 lseek函数用于设置文件的偏移量,off_t lseek(int fd, off_t offset, ...
5. 进程间通信:`pipe`创建管道,`fork`和`dup`实现管道通信,`msg*`、`sem*`和`shm*`系列函数用于消息队列、信号量和共享内存。 6. 系统信息获取:`getpid`获取进程ID,`getppid`获取父进程ID,`getuid`和`geteuid...