NetBSD/lib/libc/sys/dup.2

255 lines
6.4 KiB
Groff

.\" $NetBSD: dup.2,v 1.34 2024/05/19 16:04:46 christos Exp $
.\"
.\" Copyright (c) 1980, 1991, 1993
.\" The Regents of the University of California. All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\" notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\" notice, this list of conditions and the following disclaimer in the
.\" documentation and/or other materials provided with the distribution.
.\" 3. Neither the name of the University nor the names of its contributors
.\" may be used to endorse or promote products derived from this software
.\" without specific prior written permission.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\" @(#)dup.2 8.1 (Berkeley) 6/4/93
.\"
.Dd May 19, 2024
.Dt DUP 2
.Os
.Sh NAME
.Nm dup ,
.Nm dup2 ,
.Nm dup3
.Nd duplicate an existing file descriptor
.Sh LIBRARY
.Lb libc
.Sh SYNOPSIS
.In unistd.h
.Ft int
.Fn dup "int oldfd"
.Ft int
.Fn dup2 "int oldfd" "int newfd"
.Ft int
.Fn dup3 "int oldfd" "int newfd" "int flags"
.Sh DESCRIPTION
The
.Fn dup
family of calls duplicates an existing file descriptor
.Fa oldfd .
A new file descriptor is produced; it is a new reference to the same
underlying system object.
The object in question does not distinguish between the descriptors
referencing it in any way.
Thus for files,
.Xr read 2 ,
.Xr write 2
and
.Xr lseek 2
calls all move a single shared seek position.
Similarly, all object modes, settings, properties, and behavior other
than the close-on-exec flag are shared between references.
This includes the setting of append mode, non-blocking I/O actions,
asynchronous I/O operations in progress, socket options, and so forth.
The close-on-exec flag, however, is a property of the descriptor
rather than the object and can be set independently for each
reference.
.Pp
To get an independent handle with its own seek position and settings,
an additional
.Xr open 2
call must be issued.
(This is not generally possible for pipes and sockets.)
.Pp
The
.Fn dup
call chooses the new descriptor: it is the lowest-numbered descriptor
not currently in use.
The
.Fn dup2
and
.Fn dup3
calls allow the caller to choose the new descriptor by passing
.Fa newfd ,
which must be within the range of valid descriptors.
If
.Fa newfd
is the same as
.Fa oldfd ,
the call has no effect.
Otherwise, if
.Fa newfd
is already in use, it is closed as if
.Xr close 2
had been called.
.Pp
File descriptors are small non-negative integers that index into the
per-process file table.
Values 0, 1, and 2 have the special property that they are treated as
standard input, standard output, and standard error respectively.
(The constants
.Dv STDIN_FILENO ,
.Dv STDOUT_FILENO ,
and
.Dv STDERR_FILENO
are provided as symbolic forms for these values.)
The maximum value for a file descriptor is one less than the file
table size.
The file table size can be interrogated with
.Xr getdtablesize 3
and can to some extent be adjusted with
.Xr setrlimit 2 .
.Pp
The
.Fn dup3
call fails and returns
.Er EINVAL
if the numeric value in the
.Ar oldfd
argument is equal to the one in the
.Ar newfd
argument.
It also includes an additional
.Fa flags
argument supporting a subset of the
.Xr open 2
flags:
.Bl -tag -width O_NOSIGPIPE -offset indent
.It Dv O_CLOEXEC
Set the close-on-exec flag on
.Fa newfd .
.It Dv O_NONBLOCK
Sets non-blocking I/O.
.It Dv O_NOSIGPIPE
For pipes and sockets, do not raise
.Dv SIGPIPE
when a write is made to a broken pipe.
Instead, the write will fail with
.Er EPIPE .
.El
As described above, only the close-on-exec flag is
per-file-descriptor, so passing any of the other
.Fa flags
will affect
both
.Fa oldfd
and
.Fa newfd .
These settings are, however, applied atomically along with the rest of
the
.Fn dup3
operation.
.Pp
In the case of
.Fn dup
and
.Fn dup2
the close-on-exec flag on the new file descriptor is always left
unset and all the modes and settings of the underlying object are left
unchanged.
.Pp
Functionality similar to
.Fn dup
with slightly different semantics is also available via
.Xr fcntl 2 .
.Sh RETURN VALUES
These calls return the new file descriptor value.
In the case of
.Fn dup2
and
.Fn dup3
this is always the same as
.Fa newfd .
If an error occurs, the value \-1 is returned and
.Va errno
is set to indicate what happened.
.Sh EXAMPLES
A common use for these functions is to set up a pipe as the standard
input or standard output of a subprocess.
That is done approximately as follows (error handling omitted for
clarity):
.Bd -literal -offset indent
#include <unistd.h>
int fds[2];
pid_t pid;
pipe(fds);
pid = fork();
if (pid == 0) {
/* child; use read end of pipe to stdin */
dup2(fds[0], STDIN_FILENO);
close(fds[0]);
close(fds[1]);
execv("/some/program", args);
}
/* parent process; return write end of pipe */
close(fds[0]);
return fds[1];
.Ed
.Sh ERRORS
These functions fail if:
.Bl -tag -width Er
.It Bq Er EBADF
.Fa oldfd
is not a valid active descriptor, or for
.Fn dup2
and
.Fn dup3 ,
.Fa newfd
is not in the range of valid file descriptors.
.It Bq Er EINVAL
In the
.Fn dup3
call either the
.Fa flags
argument contained an invalid value or the
.Ar oldfd
argument is equal to the
.Ar newfd
argument.
.It Bq Er EMFILE
Too many descriptors are active.
Only
.Fn dup
can generate this error.
.El
.Sh SEE ALSO
.Xr accept 2 ,
.Xr close 2 ,
.Xr fcntl 2 ,
.Xr getrlimit 2 ,
.Xr open 2 ,
.Xr pipe 2 ,
.Xr setrlimit 2 ,
.Xr socket 2 ,
.Xr socketpair 2 ,
.Xr getdtablesize 3
.Sh STANDARDS
The
.Fn dup
and
.Fn dup2
functions conform to
.St -p1003.1-90 .
.Sh HISTORY
The
.Fn dup3
function originated in Linux and appeared in
.Nx 6.0 .