dup, dup2, dup3

名字

        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  打开的文件描述符已经达到了预设定固定值

版本注意

        dup3()是在linux2.6.27之后被添加进去了,glibc是在2.9之后添加的。

猜你喜欢

转载自blog.csdn.net/qqliyunpeng/article/details/75948833
dup