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 a successful return from dup
() or dup2
(), the old and new file descriptors
may be used interchangeably. They refer to the same open file
description (see open(2)) and thus share
file offset and file status flags; for example, if the file
offset is modified by using lseek(2) on one of the
descriptors, the offset is also changed for the other.
The two descriptors do not share file descriptor flags
(the close-on-exec flag). The close-on-exec flag
(FD_CLOEXEC
; see fcntl(2)) for the duplicate
descriptor is off.
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).
oldfd
isn't
an open file descriptor, or newfd
is out of the
allowed range for file descriptors.
(Linux only) This may be returned by dup2
() during a race condition with
open(2) and
dup
().
The dup2
() call was
interrupted by a signal.
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 from that returned by fcntl
(...,
F_DUPFD, ...) when newfd
is out of range. On some
systems dup2
() also sometimes
returns EINVAL like
F_DUPFD
.
If newfd
was open,
any errors that would have been reported at close(2) time, are lost. A
careful programmer will not use dup2
() without closing newfd
first.
|