dup, dup2 - duplicate a file descriptor |
#include <unistd.h> int dup(int oldfd); int dup2(int oldfd, int newfd); |
dup and dup2 create a copy of the file descriptor oldfd. |
After successful return of dup or dup2, the old and new descriptors may be used interchangeably. They share locks, file position pointers and flags; for example, if the file position is modified by using lseek on one of the descriptors, the position is also changed for the other. |
The two descriptors do not share the close-on-exec flag, however. |
dup uses the lowest-numbered unused descriptor for the new descriptor. |
dup2 makes newfd be the copy of oldfd, closing newfd first if necessary. |
dup and dup2 return the new descriptor, or -1 if an error occurred (in which case, errno is set appropriately). |
EBADF |
oldfd isn't an open file descriptor, or newfd is out of the allowed range for file descriptors. |
EMFILE |
The process already has the maximum number of file descriptors open and tried to open a new one. |
The error returned by dup2 is different to that returned by fcntl(..., F_DUPFD, ...) when newfd is out of range. On some systems dup2 also sometimes returns EINVAL like F_DUPFD. |
SVr4, SVID, POSIX, X/OPEN, BSD 4.3. SVr4 documents additional EINTR and ENOLINK error conditions. POSIX.1 adds EINTR. |
fcntl(2), open(2), close(2) |