名字
dup, dup2, dup3 - 复制一个文件描述符概要
#include <unistd.h>int dup(int oldfd);
int dup2(int oldfd, int newfd);
int dup3(int oldfd, int newfd, int flags); // 是GNU的扩展,不一定所以系统都支持
描述
dup()系统调用创建一个oldfd文件描述符的副本,新的文件描述符使用未用的最小的文件描述符。成功返回后,新的和老的文件描述符可以交换的使用,他们指向相同的打开的文件,共享文件的
偏移量和状态标志。
两个文件描述符不共享文件描述符的标志
dup2()系统调用同dup()大致相同,不同点是,他创建的新的文件描述符使用newfd,如果原先newfd
打开了,在使用它之前,会先默默的关闭,然后在使用。
注意的两点:
* 如果oldfd不是有效的文件描述符,调用失败,newfd不会被关闭
* 如果oldfd有效但是和newfd是相同的值,dup2不做任何事情,返回值是newfd
dup3()和dup2()相似,不同的地方:
* 调用者可以通过指定flags为O_CLOEXEC强制置位新文件描述符的 close-on-exec 标志
* 如果oldfd==newfd,dup3()调用失败,错误是EINVAL
返回值
成功,返回新的文件描述符失败,-1,相应的errno被设置
错误宏
EBADF oldfd不是一个打开的文件描述符EBADF newfd值超过了允许的范围
EBUSY 可能被dup2()和dup3()返回,open()和dup()发生竞争的时候
EINTR dup2()或者dup3()的调用被SIGNAL中断
EINVAL (dup3())的flags包含一个无效值
EINVAL (dup3())oldfd == newfd
EMFILE 打开的文件描述符已经达到了预设定固定值