---
name: "dup3"
section: "3"
platform: "freebsd"
package: "base"
version: "16.0-CURRENT-20261027-61c70dc16a79"
release: "FreeBSD 16.0-CURRENT (2026-10-27)"
platforms: ["freebsd"]
url: "https://new.carta.tech/dup3/3"
---

# dup3(3)

duplicate an existing file descriptor

## NAME

**dup3** – duplicate an existing file descriptor

## LIBRARY

Standard C Library (libc, -lc)

## SYNOPSIS

**#include \<fcntl.h\>**

**#include \<unistd.h\>**

*int*\

**dup3**(*int oldd*, *int newd*, *int flags*);

## DESCRIPTION

The **dup3**() function duplicates an existing object descriptor while allowing the value of the new descriptor to be specified.

The close-on-exec flag on the new file descriptor is determined by the O\_CLOEXEC bit in *flags*.

The close-on-fork flag on the new file descriptor is determined by the O\_CLOFORK bit in *flags*.

The resolve-beneath flag on the new file descriptor is preserved.

If *oldd*

*newd* and *flags* == 0, the behavior is identical to dup2(oldd, newd).

If *oldd* == *newd*, then **dup3**() fails, unlike [dup2(2)](/dup2/2.md).

## RETURN VALUES

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

## ERRORS

The **dup3**() function fails if:

- \[EBADF\]

  The *oldd* argument is not a valid active descriptor or the *newd* argument is negative or exceeds the maximum allowable descriptor number

- \[EINVAL\]

  The *oldd* argument is equal to the *newd* argument.

- \[EINVAL\]

  The *flags* argument has bits set other than O\_CLOEXEC or O\_CLOFORK.

## SEE ALSO

[accept(2)](/accept/2.md), [close(2)](/close/2.md), [dup2(2)](/dup2/2.md), [fcntl(2)](/fcntl/2.md), [getdtablesize(2)](/getdtablesize/2.md), [open(2)](/open/2.md), [pipe(2)](/pipe/2.md), [socket(2)](/socket/2.md), [socketpair(2)](/socketpair/2.md)

## STANDARDS

The **dup3**() function does not conform to any standard.

## HISTORY

The **dup3**() function appeared in FreeBSD 10.0. The O\_CLOFORK flag appeared in FreeBSD 15.0.
