dup(2) System Calls Manual dup(2) dup, dup2, dup3 - (libc -lc) #include int dup(int oldfd); int dup2(int oldfd, int newfd); #define _GNU_SOURCE /* feature_test_macros(7) */ #include /* O_* */ #include int dup3(int oldfd, int newfd, int flags); dup() oldfd. ( open(2).) . . lseek(2) . ( ). (FD_CLOEXEC fcntl(2)) . dup2() dup2() dup() newfd. newfd oldfd. newfd ( dup2()). newfd . close(2) dup() newfd . . : o oldfd newfd. o oldfd newfd oldfd dup2() newfd. dup3() dup3() dup2() : o O_CLOEXEC flags. open(2) . o oldfd newfd dup3() EINVAL. . -1 errno . EBADF oldfd . EBADF newfd ( RLIMIT_NOFILE getrlimit(2)). EBUSY ( ) dup2() dup3() open(2) dup(). EINTR dup2() dup3() signal(7). EINVAL (dup3()) flags . EINVAL (dup3()) oldfd newfd. EMFILE ( RLIMIT_NOFILE getrlimit(2)). ENOMEM . POSIX.1-2024. dup() dup2() 4.3BSD SVr4 POSIX.1-1988. dup3() POSIX.1-2024. Linux 2.6.27, glibc 2.9. dup2() fcntl(..., F_DUPFD, ...) newfd . dup2() EINVAL F_DUPFD. newfd close(2) . -- -- newfd dup2() . : /* Obtain a duplicate of 'newfd' that can subsequently be used to check for close() errors; an EBADF error means that 'newfd' was not open. */ tmpfd = dup(newfd); if (tmpfd == -1 && errno != EBADF) { /* Handle unexpected dup() error. */ } /* Atomically duplicate 'oldfd' on 'newfd'. */ if (dup2(oldfd, newfd) == -1) { /* Handle dup2() error. */ } /* Now check for close() errors on the file originally referred to by 'newfd'. */ if (tmpfd != -1) { if (close(tmpfd) == -1) { /* Handle errors from close. */ } } close(2), fcntl(2), open(2), pidfd_getfd(2) 3 . . : . 6.18 8 2026 dup(2)