File descriptor flags are miscellaneous attributes of a file descriptor. These flags are associated with particular file descriptors, so that if you have created duplicate file descriptors from a single opening of a file, each descriptor has its own set of flags.
Currently there is just one file descriptor flag: FD_CLOEXEC
, which causes the descriptor to be closed if you use any of the exec...
functions (see Executing a File).
The symbols in this section are defined in the header file `fcntl.h'.
fcntl
, to specify that it should return the file descriptor flags associated with the filedes argument.
The normal return value from fcntl
with this command is a nonnegative number which can be interpreted as the bitwise OR of the individual flags (except that currently there is only one flag to use).
In case of an error, fcntl
returns -1
. The following errno
error conditions are defined for this command:
EBADF
fcntl
, to specify that it should set the file descriptor flags associated with the filedes argument. This requires a third int
argument to specify the new flags, so the form of the call is:
fcntl (filedes, F_SETFD, new-flags)
The normal return value from fcntl
with this command is an unspecified value other than -1
, which indicates an error. The flags and error conditions are the same as for the F_GETFD
command.
The following macro is defined for use as a file descriptor flag with the fcntl
function. The value is an integer constant usable as a bit mask value.
exec
function is invoked; see Executing a File. When a file descriptor is allocated (as with open
or dup
), this bit is initially cleared on the new file descriptor, meaning that descriptor will survive into the new program after exec
.
If you want to modify the file descriptor flags, you should get the current flags with F_GETFD
and modify the value. Don't assume that the flags listed here are the only ones that are implemented; your program may be run years from now and more flags may exist then. For example, here is a function to set or clear the flag FD_CLOEXEC
without altering any other flags:
/* Set theFD_CLOEXEC
flag of desc if value is nonzero, or clear the flag if value is 0. Return 0 on success, or -1 on error witherrno
set. */ int set_cloexec_flag (int desc, int value) { int oldflags = fcntl (desc, F_GETFD, 0); /* If reading the flags failed, return error indication now. if (oldflags < 0) return oldflags; /* Set just the flag we want to set. */ if (value != 0) oldflags |= FD_CLOEXEC; else oldflags &= ~FD_CLOEXEC; /* Store modified flag word in the descriptor. */ return fcntl (desc, F_SETFD, oldflags); }