NAME

     dup, dup2 - duplicate a descriptor


SYNOPSIS

     #include <unistd.h>

     int dup(int oldd)
     int dup2(int oldd, int newd)


DESCRIPTION

     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 unset.

     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 equals oldd.


RETURN VALUE

     The value -1 is returned if an error occurs in either  call.
     The  external  variable  errno  indicates  the  cause of the
     error.


ERRORS

     Dup and dup2 fail if:

     [EBADF]        Oldd or newd is not a valid active descriptor

     [EMFILE]       Too many descriptors are active.


NOTES

     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 programs.


SEE ALSO

     open(2), close(2), fcntl(2), pipe(2).