前言
- 关于dup()和dup2()的使用在Linux系统编程中是十分重要的一环,但关于dup2()的使用总有一种雾蒙蒙的感觉,本文会从dup()说起,希望可以带领大家走过迷雾
- 文中代码片中代码仅供逻辑参考
- 因本人水平有限,若文中有何纰漏,恳请各位斧正
定义
详解
- dup()的使用与open(),close()函数的联系十分密切
- 思考一下,我们如何完成将stdin重定向至文件
close then open
- 在使用dup()前,我们可以利用“最低可用文件描述符”原理来完成一次小实验
- 最低可用文件描述符:Lowest-Available-Fd
- 思考一下,我们如何利用上述原则来完成将stdin重定向至文件
- 第一步:使用close(0),将标准输入与终端设备的连接切断
- 第二步:使用open(somefile, R_RDONLY)来打开一个文件
- 由于此时最低可用文件描述符为0,所以上一步骤所打开的文件将被连接到标准输入上去
int fd;
close(0);
fd = open("/exc/passwd", O_RDONLY);
open - close - dup -close
- 系统调用dup()建立指向已经存在的文件描述符的第二个连接
- 四个步骤:
- open(file): 打开想要重定向的文件
- close(0)
- dup(fd):复制文件描述符fd,此次复制使用最低可用文件描述符,在此处即为0,此时文件就已经与文件描述符0连接至一起了
- close(fd):关闭文件的原始连接,只留下与文件描述符0的连接

int fd;
int newfd;
fd = open("/etc/passwd",R_RDOMLY);
close(0);
newfd = dup(fd);
close(fd);
open - dup2 - close
- dup2()的man手册定义:

- dup2()用来替换close(0)和dup(fd)
- dup2(old,new)将文件描述符old复制到文件描述符new,在此之前它先将文件描述符new上已经存在的连接关闭
int fd;
int newfd;
fd = open("/etc/passwd",R_RDOMLY);
newfd = dup2(fd,0);
close(fd);
参考: