dup()用来复制参数oldfd所指的文件描述符。当复制成功是,返回最小的尚未被使用过的文件描述符,若有错误则返回-1.错误代码存入errno中返回的新文件描述符和参数oldfd指向同一个文件,这两个描述符共享同一个数据结构,共享所有的锁,读写指针和各项全现或标志位。

dup2() 功能和 dup() 完全相同,但是可以指定新的描述符。dup2与dup区别是dup2可以用参数newfd指定新文件描述符的数值。若参数newfd已经被程序使用,则系统就会将newfd所指的文件关闭,若newfd等于oldfd,则返回newfd,而不关闭newfd所指的文件。dup2所复制的文件描述符与原来的文件描述符共享各种文件状态。共享所有的锁定,读写位置和各项权限或flags等。

dup() 和 dup2() 都不共享描述符的 close-on-exec 标志。

dup3() 除了以下2点外完全和 dup2() 一致。

  1. 可以利用 flag 参数,指定新的描述符的 close-on-exec 标志。
  2. 当 newfd 等于 oldfd 的时候,会返回 EINVAL 错误。
#include <unistd.h>

 int dup(int oldfd);
 int dup2(int oldfd, int newfd);

 #define _GNU_SOURCE             /* See feature_test_macros(7) */
 #include <fcntl.h>              /* Obtain O_* constant definitions */
 #include <unistd.h>

 int dup3(int oldfd, int newfd, int flags);

close-on-exec 标志是指在调用 exec 之前会关闭这个描述符。