1、简介

我们想要复制一个文件描述符的话,经常会使用dup()函数和dup2()函数。关于dup()函数的使用十分简单,但是很多人在使用dup2()函数进行文件重定向的时候会有疑问,总觉得两个参数是反的。接下来我说一下对这个函数的理解。^-^

2、dup2()函数

2.1 头文件和函数原型

#include <unistd.h>
int dup2(int oldfd, int newfd);

2.2 参数简介

  • oldfd:原来的文件描述符
  • newfd:复制成的新的文件描述符

2.3 函数返回值

  • 成功:将oldfd复制给newfd, 两个文件描述符指向同一个文件
  • 失败:返回-1, 设置errno值

当调用dup2(int oldfd,int newfd)之后,若newfd原来已经打开了一个文件,则先关闭这个文件,然后newfd和oldfd指向了相同的文件;若newfd原来没有打开一个文件,则newfd直接指向和oldfd指向相同的文件。

3、疑问

可能会有人(就是我)有这样的问题:看上述的介绍,感觉意思是将oldfd重定向了newfd了啊。为什么实际是相反的呢?拿一个例子说明一下:比如要将终端输出重定向至文件中

//int fd = open("./README.TXT",O_RDWR|O_APPEND,0777);
dup2(fd,STDIN_FILENO);

我的理解是:实际上通过调用dup2(fd,STDIN_FILENO);fd和STDIN_FILENO之间建立了一种关系。本来所有函数的输出都要往终端输出哪里走,但是通过调用dup2函数,终端输出关闭了(也就是若newfd原来已经打开了一个文件,则先关闭这个文件),那么终端输出关闭后这些输出往哪里去呢?当然是往我们新复制的文件描述符这里了。所有相当于是把newfd重定向至了oldfd

笔记
dup2(newfd,oldfd):它的意思是将oldfd重定向至newfd。!!!