#include <unistd.h>
int dup(int filedes) ; => fcntl (filedes, F_DUPFD, 0);
int dup2(int filedes, int filedes2) ; => close(filedes2) ; fcntl(filedes, F_DUPFD, filedes2);
(atomic operation) (2 operations)
Synopsis
#include <unistd.h>
int dup(int fildes);
int dup2(int fildes, int fildes2);
Description
The dup() and dup2() functions provide an alternative interface to the service provided by fcntl() using the F_DUPFD command. The call:
fid = dup(fildes);
shall be equivalent to:
fid = fcntl(fildes, F_DUPFD, 0);
The call:
fid = dup2(fildes, fildes2);
shall be equivalent to:
close(fildes2); fid = fcntl(fildes, F_DUPFD, fildes2);
except for the following:
-
*
- If fildes2 is less than 0 or greater than or equal to {OPEN_MAX}, dup2() shall return -1 with errno set to [EBADF]. *
- If fildes is a valid file descriptor and is equal to fildes2, dup2() shall return fildes2 without closing it. *
- If fildes is not a valid file descriptor, dup2() shall return -1 and shall not close fildes2. *
- The value returned shall be equal to the value of fildes2 upon successful completion, or -1 upon failure.
fcntl()
Name
fcntl - manipulate file descriptor
Synopsis
#include <unistd.h> #include <fcntl.h> int fcntl(int fd, int cmd); int fcntl(int fd, int cmd, long arg); int fcntl(int fd, int cmd, struct flock *lock);
Description
fcntl() performs one of the operations described below on the open file descriptor fd. The operation is determined by cmd.
Duplicating a file descriptor
-
F_DUPFD
-
Find the lowest numbered available file descriptor greater than or equal to
arg and make it be a copy of
fd. This is different from
dup2(2) which uses exactly the descriptor specified.
On success, the new descriptor is returned.
See dup(2) for further details.
File descriptor flags
-
The following commands manipulate the flags associated with a file descriptor. Currently, only one such flag is defined:
FD_CLOEXEC, the close-on-exec flag. If the
FD_CLOEXEC bit is 0, the file descriptor will remain open across an
execve(2), otherwise it will be closed.
F_GETFD
- Read the file descriptor flags. F_SETFD
- Set the file descriptor flags to the value specified by arg.
File status flags
-
Each open file description has certain associated status flags, initialized by
open(2) and possibly modified by
fcntl(2). Duplicated file descriptors (made with
dup(),
fcntl(F_DUPFD),
fork(), etc.) refer to the same open file description, and thus share the same file status flags.
- Read the file status flags. F_SETFL
- Set the file status flags to the value specified by arg. File access mode ( O_RDONLY, O_WRONLY, O_RDWR) and file creation flags (i.e., O_CREAT, O_EXCL, O_NOCTTY, O_TRUNC) in arg are ignored. On Linux this command can only change the O_APPEND, O_ASYNC, O_DIRECT, O_NOATIME, and O_NONBLOCK flags.
The file status flags and their semantics are described in open(2).
F_GETFLAdvisory locking
-
F_GETLK,
F_SETLK and
F_SETLKW are used to acquire, release, and test for the existence of record locks (also known as file-segment or file-region locks). The third argument
lock is a pointer to a structure that has at least the following fields (in unspecified order).
struct flock { ... short l_type; /* Type of lock: F_RDLCK, F_WRLCK, F_UNLCK */ short l_whence; /* How to interpret l_start: SEEK_SET, SEEK_CUR, SEEK_END */ off_t l_start; /* Starting offset for lock */ off_t l_len; /* Number of bytes to lock */ pid_t l_pid; /* PID of process blocking our lock (F_GETLK only) */ ... };