dup3(3)

dup33

Duplicate an existing file descriptor

Usage

#include <fcntl.h>

#include <unistd.h>

int

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

Library

Standard C Library (libc, -lc)

Overview

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

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.

Releases

30 releases since FreeBSD 10.0-RELEASE; the text changed 18 times.

  1. 10.0
  2. 10.1
  3. 10.2
  4. 10.3
  5. 10.4
  6. 11.0
  7. 11.1
  8. 11.2
  9. 11.3
  10. 11.4
  11. 12.0
  12. 12.1
  13. 12.2
  14. 12.3
  15. 12.4
  16. 13.0–13.2
  17. 13.3–14.5
  18. 15.0
  19. 15.1–16.0

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.

From base 16.0-CURRENT-20261027-61c70dc16a79 in FreeBSD 16.0-CURRENT (2026-10-27). Parsed by carta from the page's mdoc source.