dup, dup2 - duplicate a descriptor

     #include <unistd.h>

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

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