基础信息:
- 所需头文件:
#include <unistd.h>
- 函数原型:
int dup2(int oldfd, int newfd);
- 返回值:成功返回新的文件描述符,失败返回-1
- 功能:将
oldfd
描述符复制给newfd
深入理解:
当我们把oldfd
和newfd
传入到dup2
时,到底发生了什么呢?
这里需要用到有关文件方面的知识了,作一个简要的说明(具体请参考我之前的博客http://blog.csdn.net/move_now/article/details/62054836):
内核在表示一个打开的文件时使用了三个数据结构,文件描述符表,文件表以及v节点表。
1. 文件描述符表:每个进程都独有的一张用于存储文件描述符标志和指向文件表某一项的文件指针
2. 文件表:每一项都代表了一个打开的文件,存储的是文件的状态标志以及当前文件的偏移量还有指向v节点表的指针(注意同一文件可以被打开多次)
3. v节点表:存储了v节点的信息(文件类型以及对此文件进行操作的各种函数的指针)和i节点。i节点是在打开文件时从磁盘上读入内存的,里面存储了文件的大量信息,我们平时使用的ls -l
命令读取的信息大部分就是从i节点里面提取出来的。
知道了这些,其实我们调用dup2
之后,相当于newfd
的文件指针被