dup, dup2 - duplicate a descriptor
int dup(int oldd)
int dup2(int oldd, int newd)
Dup duplicates an existing descriptor. The argument oldd is a small non-
negative integer index in the per-process descriptor table. The value
must be less than OPEN_MAX, the size of the table. The new descriptor
returned by the call, let's name it newd, is the lowest numbered
descriptor that is not currently in use by the process.
The object referenced by the descriptor does not distinguish between
references using oldd and newd in any way. Thus if newd and oldd are
duplicate references to an open file, read(2), write(2) and lseek(2)
calls all move a single pointer into the file, and append mode, non-
blocking I/O and asynchronous I/O options are shared between the
references. If a separate pointer into the file is desired, a different
object reference to the file must be obtained by issuing an additional
open(2) call. The close-on-exec flag on the new file descriptor is
In the second form of the call, the value of newd desired is specified.
If this descriptor is already in use, the descriptor is first deallocated
as if a close(2) call had been done first. Newd is not closed if it
The value -1 is returned if an error occurs in either call. The external
variable errno indicates the cause of the error.
Dup and dup2 fail if:
[EBADF] Oldd or newd is not a valid active descriptor
[EMFILE] Too many descriptors are active.
Dup and dup2 are now implemented using the F_DUPFD function of fcntl(2),
although the old system call interfaces still exist to support old
open(2), close(2), fcntl(2), pipe(2).