summaryrefslogtreecommitdiffstats
path: root/man2/fcntl.2
diff options
context:
space:
mode:
Diffstat (limited to 'man2/fcntl.2')
-rw-r--r--man2/fcntl.2747
1 files changed, 747 insertions, 0 deletions
diff --git a/man2/fcntl.2 b/man2/fcntl.2
new file mode 100644
index 000000000..c6aa1d7ba
--- /dev/null
+++ b/man2/fcntl.2
@@ -0,0 +1,747 @@
+'\" t
+.\" Hey Emacs! This file is -*- nroff -*- source.
+.\"
+.\" This manpage is Copyright (C) 1992 Drew Eckhardt;
+.\" 1993 Michael Haardt, Ian Jackson;
+.\" 1998 Jamie Lokier;
+.\" 2002 Michael Kerrisk.
+.\"
+.\" Permission is granted to make and distribute verbatim copies of this
+.\" manual provided the copyright notice and this permission notice are
+.\" preserved on all copies.
+.\"
+.\" Permission is granted to copy and distribute modified versions of this
+.\" manual under the conditions for verbatim copying, provided that the
+.\" entire resulting derived work is distributed under the terms of a
+.\" permission notice identical to this one.
+.\"
+.\" Since the Linux kernel and libraries are constantly changing, this
+.\" manual page may be incorrect or out-of-date. The author(s) assume no
+.\" responsibility for errors or omissions, or for damages resulting from
+.\" the use of the information contained herein. The author(s) may not
+.\" have taken the same level of care in the production of this manual,
+.\" which is licensed free of charge, as they might when working
+.\" professionally.
+.\"
+.\" Formatted or processed versions of this manual, if unaccompanied by
+.\" the source, must acknowledge the copyright and authors of this work.
+.\"
+.\" Modified 1993-07-24 by Rik Faith <faith@cs.unc.edu>
+.\" Modified 1995-09-26 by Andries Brouwer <aeb@cwi.nl>
+.\" and again on 960413 and 980804 and 981223.
+.\" Modified 1998-12-11 by Jamie Lokier <jamie@imbolc.ucc.ie>
+.\" Applied correction by Christian Ehrhardt - aeb, 990712
+.\" Modified 2002-04-23 by Michael Kerrisk <mtk16@ext.canterbury.ac.nz>
+.\" Added note on F_SETFL and O_DIRECT
+.\" Complete rewrite + expansion of material on file locking
+.\" Incorporated description of F_NOTIFY, drawing on
+.\" Stephen Rothwell's notes in Documentation/dnotify.txt.
+.\" Added description of F_SETLEASE and F_GETLEASE
+.\" Corrected and polished, aeb, 020527.
+.\" Modified 2004-03-03 by Michael Kerrisk <mtk16@ext.canterbury.ac.nz>
+.\" Modified description of file leases: fixed some errors of detail
+.\" Replaced the term "lease contestant" by "lease breaker"
+.\" Modified, 27 May 2004, Michael Kerrisk <mtk16@ext.canterbury.ac.nz>
+.\" Added notes on capability requirements
+.\"
+.TH FCNTL 2 2004-05-27 "Linux 2.6.6" "Linux Programmer's Manual"
+.SH NAME
+fcntl \- manipulate file descriptor
+.SH SYNOPSIS
+.nf
+.B #include <unistd.h>
+.B #include <fcntl.h>
+.sp
+.BI "int fcntl(int " fd ", int " cmd );
+.BI "int fcntl(int " fd ", int " cmd ", long " arg );
+.BI "int fcntl(int " fd ", int " cmd ", struct flock *" lock );
+.fi
+.SH DESCRIPTION
+.B fcntl
+performs one of various miscellaneous operations on
+.IR fd .
+The operation in question is determined by
+.IR cmd .
+.SS "Handling close-on-exec"
+.TP
+.B F_DUPFD
+Find the lowest numbered available file descriptor
+greater than or equal to
+.I arg
+and make it be a copy of
+.IR fd .
+This is different form
+.BR dup2 (2)
+which uses exactly the descriptor specified.
+.sp
+The old and new descriptors may be used interchangeably. They share locks,
+file position pointers and flags; for example, if the file position is
+modified by using
+.B lseek
+on one of the descriptors, the position is also changed for the other.
+.sp
+The two descriptors do not share the close-on-exec flag, however.
+The close-on-exec flag of the copy is off, meaning that it will
+not be closed on exec.
+.sp
+On success, the new descriptor is returned.
+.TP
+.B F_GETFD
+Read the close-on-exec flag. If the
+.B FD_CLOEXEC
+bit is 0, the file will remain open across
+.BR exec ,
+otherwise it will be closed.
+.TP
+.B F_SETFD
+Set the close-on-exec flag to the value specified by the
+.B FD_CLOEXEC
+bit of
+.IR arg .
+.SS "The file status flags"
+A file descriptor has certain associated flags, initialized by
+.BR open (2)
+.\" or
+.\" .BR creat (2),
+and possibly modified by
+.BR fcntl (2).
+The flags are shared between copies (made with
+.BR dup (2),
+.BR fork (2),
+etc.) of the same file descriptor.
+.sp
+The flags and their semantics are described in
+.BR open (2).
+.TP
+.B F_GETFL
+Read the file descriptor's flags.
+.TP
+.B F_SETFL
+Set the file status flags part of the descriptor's flags to the value
+specified by
+.IR arg .
+Remaining bits (access mode, file creation flags) in
+.I arg
+are ignored.
+On Linux this command can only change the O_APPEND, O_NONBLOCK, O_ASYNC,
+and O_DIRECT flags.
+.P
+.SS "Advisory locking"
+.BR 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
+.I lock
+is a pointer to a structure that has at least the following fields
+(in unspecified order).
+.in +2n
+.nf
+.sp
+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) */
+ ...
+};
+.fi
+.in -2n
+.P
+The
+.IR l_whence ", " l_start ", and " l_len
+fields of this structure specify the range of bytes we wish to lock.
+.I l_start
+is the starting offset for the lock, and is interpreted
+relative to either:
+the start of the file (if
+.I l_whence
+is
+.BR SEEK_SET );
+the current file offset (if
+.I l_whence
+is
+.BR SEEK_CUR );
+or the end of the file (if
+.I l_whence
+is
+.BR SEEK_END ).
+In the final two cases,
+.I l_start
+can be a negative number provided the
+offset does not lie before the start of the file.
+.I l_len
+is a non-negative integer (but see the NOTES below) specifying
+the number of bytes to be locked.
+Bytes past the end of the file may be locked,
+but not bytes before the start of the file.
+Specifying 0 for
+.I l_len
+has the special meaning: lock all bytes starting at the
+location specified by
+.IR l_whence " and " l_start
+through to the end of file, no matter how large the file grows.
+.P
+The
+.I l_type
+field can be used to place a read
+.RB ( F_RDLCK )
+or a write
+.RB ( F_WDLCK )
+lock on a file.
+Any number of processes may hold a read lock (shared lock)
+on a file region, but only one process may hold a write lock
+(exclusive lock). An exclusive lock excludes all other locks,
+both shared and exclusive.
+A single process can hold only one type of lock on a file region;
+if a new lock is applied to an already-locked region,
+then the existing lock is converted to the the new lock type.
+(Such conversions may involve splitting, shrinking, or coalescing with
+an existing lock if the byte range specified by the new lock does not
+precisely coincide with the range of the existing lock.)
+.TP
+.B F_SETLK
+Acquire a lock (when
+.I l_type
+is
+.B F_RDLCK
+or
+.BR F_WRLCK )
+or release a lock (when
+.I l_type
+is
+.BR F_UNLCK )
+on the bytes specified by the
+.IR l_whence ", " l_start ", and " l_len
+fields of
+.IR lock .
+If a conflicting lock is held by another process,
+this call returns \-1 and sets
+.I errno
+to
+.B EACCES
+or
+.BR EAGAIN .
+.TP
+.B F_SETLKW
+As for
+.BR F_SETLK ,
+but if a conflicting lock is held on the file, then wait for that
+lock to be released.
+If a signal is caught while waiting, then the call is interrupted
+and (after the signal handler has returned)
+returns immediately (with return value \-1 and
+.I errno
+set to
+.BR EINTR ).
+.TP
+.B F_GETLK
+On input to this call,
+.I lock
+describes a lock we would like to place on the file.
+If the lock could be placed,
+.BR fcntl ()
+does not actually place it, but returns
+.B F_UNLCK
+in the
+.I l_type
+field of
+.I lock
+and leaves the other fields of the structure unchanged.
+If one or more incompatible locks would prevent
+this lock being placed, then
+.BR fcntl ()
+returns details about one of these locks in the
+.IR l_type ", " l_whence ", " l_start ", and " l_len
+fields of
+.I lock
+and sets
+.I l_pid
+to be the PID of the process holding that lock.
+.P
+In order to place a read lock,
+.I fd
+must be open for reading.
+In order to place a write lock,
+.I fd
+must be open for writing.
+To place both types of lock, open a file read-write.
+.P
+As well as being removed by an explicit
+.BR F_UNLCK ,
+record locks are automatically released when the process
+terminates or if it closes
+.I any
+file descriptor referring to a file on which locks are held.
+.\" (Additional file descriptors referring to the same file
+.\" may have been obtained by calls to
+.\" .BR open "(2), " dup "(2), " dup2 "(2), or " fcntl (2).)
+This is bad: it means that a process can lose the locks on
+a file like
+.I /etc/passwd
+or
+.I /etc/mtab
+when for some reason a library function decides to open, read
+and close it.
+.P
+Record locks are not inherited by a child created via
+.BR fork (2),
+but are preserved across an
+.BR execve (2).
+.P
+Because of the buffering performed by the
+.BR stdio (3)
+library, the use of record locking with routines in that package
+should be avoided; use
+.BR read "(2) and " write (2)
+instead.
+.P
+.SS "Mandatory locking"
+(Non-POSIX.)
+The above record locks may be either advisory or mandatory,
+and are advisory by default.
+To make use of mandatory locks, mandatory locking must be enabled
+(using the "-o mand" option to
+.BR mount (8))
+for the file system containing the
+file to be locked and enabled on the file itself (by disabling
+group execute permission on the file and enabling the set-GID
+permission bit).
+
+Advisory locks are not enforced and are useful only between
+cooperating processes. Mandatory locks are enforced for all
+processes.
+.P
+.SS "Managing signals"
+.BR F_GETOWN ", " F_SETOWN ", " F_GETSIG " and " F_SETSIG
+are used to manage I/O availability signals:
+.TP
+.B F_GETOWN
+Get the process ID or process group currently receiving SIGIO
+and SIGURG signals for events on file descriptor
+.IR fd .
+Process groups are returned as negative values.
+.TP
+.B F_SETOWN
+Set the process ID or process group that will receive SIGIO
+and SIGURG signals for events on file descriptor
+.IR fd .
+Process groups are specified using negative values.
+.RB ( F_SETSIG
+can be used to specify a different signal instead of SIGIO).
+
+.\" From glibc.info:
+If you set the
+.B O_ASYNC
+status flag on a file descriptor (either by providing this flag with the
+.IR open (2)
+call, or by using the
+.B F_SETFL
+command of
+.BR fcntl ),
+a SIGIO signal is sent whenever input or output becomes possible
+on that file descriptor.
+.sp
+The process or process group to receive the signal can be selected by
+using the
+.B F_SETOWN
+command to the
+.B fcntl
+function. If the file descriptor is a socket, this also selects
+the recipient of SIGURG signals that are delivered when out-of-band
+data arrives on that socket. (SIGURG is sent in any situation where
+.BR select (2)
+would report the socket as having an "exceptional condition".)
+If the file descriptor corresponds to a terminal device, then SIGIO
+signals are sent to the foreground process group of the terminal.
+.TP
+.B F_GETSIG
+Get the signal sent when input or output becomes possible. A value of
+zero means SIGIO is sent. Any other value (including SIGIO) is the
+signal sent instead, and in this case additional info is available to
+the signal handler if installed with SA_SIGINFO.
+.TP
+.B F_SETSIG
+Sets the signal sent when input or output becomes possible. A value of
+zero means to send the default SIGIO signal. Any other value (including
+SIGIO) is the signal to send instead, and in this case additional info
+is available to the signal handler if installed with SA_SIGINFO.
+.sp
+By using F_SETSIG with a non-zero value, and setting SA_SIGINFO for the
+signal handler (see
+.BR sigaction (2)),
+extra information about I/O events is passed to
+the handler in a
+.I siginfo_t
+structure.
+If the
+.I si_code
+field indicates the source is SI_SIGIO, the
+.I si_fd
+field gives the file descriptor associated with the event. Otherwise,
+there is no indication which file descriptors are pending, and you
+should use the usual mechanisms
+.RB ( select (2),
+.BR poll (2),
+.BR read (2)
+with
+.B O_NONBLOCK
+set etc.) to determine which file descriptors are available for I/O.
+.sp
+By selecting a POSIX.1b real time signal (value >= SIGRTMIN), multiple
+I/O events may be queued using the same signal numbers. (Queuing is
+dependent on available memory). Extra information is available
+if SA_SIGINFO is set for the signal handler, as above.
+.PP
+Using these mechanisms, a program can implement fully asynchronous I/O
+without using
+.BR select (2)
+or
+.BR poll (2)
+most of the time.
+.PP
+The use of
+.BR O_ASYNC ,
+.BR F_GETOWN ,
+.B F_SETOWN
+is specific to BSD and Linux.
+.B F_GETSIG
+and
+.B F_SETSIG
+are Linux-specific. POSIX has asynchronous I/O and the
+.I aio_sigevent
+structure to achieve similar things; these are also available
+in Linux as part of the GNU C Library (Glibc).
+.P
+.SS Leases
+.B F_SETLEASE
+and
+.B F_GETLEASE
+(Linux 2.4 onwards) are used (respectively) to establish and
+retrieve the current setting of the calling process's lease on
+the file referred to by
+.IR fd .
+A file lease provides a mechanism whereby the process holding
+the lease (the "lease holder") is notified (via delivery of a signal)
+when another process (the "lease breaker") tries to
+.BR open (2)
+or
+.BR truncate (2)
+that file.
+.TP
+.B F_SETLEASE
+Set or remove a file lease according to which of the following
+values is specified in the integer
+.IR arg :
+
+.RS
+.TP
+.B F_RDLCK
+Take out a read lease.
+This will cause us to be notified when
+another process opens the file for writing or truncates it.
+.TP
+.B F_WRLCK
+Take out a write lease.
+This will cause us to be notified when
+another process opens the file (for reading or writing) or truncates it.
+A write lease may be placed on a file only if no other process
+currently has the file open.
+.TP
+.B F_UNLCK
+Remove our lease from the file.
+.RE
+.P
+A process may hold only one type of lease on a file.
+.P
+Leases may only be taken out on regular files.
+An unprivileged process may only take out a lease on a file whose
+UID matches the file system UID of the process.
+A process with the
+.B CAP_LEASE
+capability may take out leases on arbitrary files.
+.TP
+.B F_GETLEASE
+Indicates what type of lease we hold on the file
+referred to by
+.I fd
+by returning either
+.BR F_RDLCK ", " F_WRLCK ", or " F_UNLCK,
+indicating, respectively, that the calling process holds a
+read, a write, or no lease on the file.
+(The third argument to
+.BR fcntl ()
+is omitted.)
+.PP
+When a process (the "lease breaker") performs an
+.BR open ()
+or
+.BR truncate ()
+that conflicts with a lease established via
+.BR F_SETLEASE ,
+the system call is blocked by the kernel, unless the
+.B O_NONBLOCK
+flag was specified to
+.BR open (),
+in which case the system call will return with the error
+.BR EWOULDBLOCK .
+The kernel notifies the lease holder by sending it a signal
+(SIGIO by default).
+The lease holder should respond to receipt of this signal by doing
+whatever cleanup is required in preparation for the file to be
+accessed by another process (e.g., flushing cached buffers) and
+then either remove or downgrade its lease.
+A lease is removed by performing an
+.B F_SETLEASE
+command specifying
+.I arg
+as
+.BR F_UNLCK .
+If we currently hold a write lease on the file,
+and the lease breaker is opening the file for reading,
+then it is sufficient to downgrade the lease to a read lease.
+This is done by performing an
+.B F_SETLEASE
+command specifying
+.I arg
+as
+.BR F_RDLCK .
+
+If the lease holder fails to downgrade or remove the lease within
+the number of seconds specified in
+.I /proc/sys/fs/lease-break-time
+then the kernel forcibly removes or downgrades the lease holder's lease.
+
+Once the lease has been voluntarily or forcibly removed or downgraded,
+and assuming the lease breaker has not unblocked its system call,
+the kernel permits the lease breaker's system call to proceed.
+
+The default signal used to notify the lease holder is SIGIO,
+but this can be changed using the
+.B F_SETSIG
+command to
+.B fcntl ().
+If a
+.B F_SETSIG
+command is performed (even one specifying SIGIO), and the signal
+handler is established using SA_SIGINFO, then the handler will
+receive a
+.I siginfo_t
+sructure as its second argument, and the
+.I si_fd
+field of this argument will hold the descriptor of the leased file
+that has been accessed by another process.
+(This is useful if the caller holds leases against multiple files).
+.SS "File and directory change notification"
+.TP
+.B F_NOTIFY
+(Linux 2.4 onwards)
+Provide notification when the directory referred to by
+.I fd
+or any of the files that it contains is changed.
+The events to be notified are specified in
+.IR arg ,
+which is a bit mask specified by ORing together zero or more of
+the following bits:
+
+.TS
+l l
+----
+lB l.
+Bit Description (event in directory)
+DN_ACCESS A file was accessed (read, pread, readv)
+DN_MODIFY A file was modified (write, pwrite,
+ writev, truncate, ftruncate)
+DN_CREATE A file was created (open, creat, mknod,
+ mkdir, link, symlink, rename)
+DN_DELETE A file was unlinked (unlink, rename to
+ another directory, rmdir)
+DN_RENAME A file was renamed within this
+ directory (rename)
+DN_ATTRIB The attributes of a file were changed
+ (chown, chmod, utime[s])
+.TE
+.sp
+(In order to obtain these definitions, the _GNU_SOURCE macro must be
+defined before including <fcntl.h>.)
+.sp
+Directory notifications are normally "one-shot", and the application
+must re-register to receive further notifications.
+Alternatively, if
+.B DN_MULTISHOT
+is included in
+.IR arg ,
+then notification will remain in effect until explicitly removed.
+
+.\" The following does seem a poor API-design choice...
+A series of
+.B F_NOTIFY
+requests is cumulative, with the events in
+.I arg
+being added to the set already monitored.
+To disable notification of all events, make an
+.B F_NOTIFY
+call specifying
+.I arg
+as 0.
+.sp
+Notification occurs via delivery of a signal.
+The default signal is SIGIO, but this can be changed using the
+.B F_SETSIG
+command to
+.BR fcntl ().
+In the latter case, the signal handler receives a
+.I siginfo_t
+structure as its second argument (if the handler was
+established using SA_SIGINFO) and the
+.I si_fd
+field of this structure contains the file descriptor which
+generated the notification (useful when establishing notification
+on multiple directories).
+.sp
+Especially when using
+.BR DN_MULTISHOT ,
+a POSIX.1b real time signal should be used for notication,
+so that multiple notifications can be queued.
+.SH "RETURN VALUE"
+For a successful call, the return value depends on the operation:
+.TP 0.9i
+.B F_DUPFD
+The new descriptor.
+.TP
+.B F_GETFD
+Value of flag.
+.TP
+.B F_GETFL
+Value of flags.
+.TP
+.B F_GETOWN
+Value of descriptor owner.
+.TP
+.B F_GETSIG
+Value of signal sent when read or write becomes possible, or zero
+for traditional SIGIO behaviour.
+.TP
+All other commands
+Zero.
+.PP
+On error, \-1 is returned, and
+.I errno
+is set appropriately.
+.SH ERRORS
+.TP
+.BR EACCES " or " EAGAIN
+Operation is prohibited by locks held by other processes.
+Or, operation is prohibited because the file has been memory-mapped by
+another process.
+.TP
+.B EBADF
+.I fd
+is not an open file descriptor, or the command was
+.B F_SETLK
+or
+.B F_SETLKW
+and the file descriptor open mode doesn't match with the
+type of lock requested.
+.TP
+.B EDEADLK
+It was detected that the specified
+.B F_SETLKW
+command would cause a deadlock.
+.TP
+.B EFAULT
+.I lock
+is outside your accessible address space.
+.TP
+.B EINTR
+For
+.BR F_SETLKW ,
+the command was interrupted by a signal.
+For
+.BR F_GETLK " and " F_SETLK ,
+the command was interrupted by a signal before the lock was checked or
+acquired. Most likely when locking a remote file (e.g. locking over
+NFS), but can sometimes happen locally.
+.TP
+.B EINVAL
+For
+.BR F_DUPFD ,
+.I arg
+is negative or is greater than the maximum allowable value. For
+.BR F_SETSIG ,
+.I arg
+is not an allowable signal number.
+.TP
+.B EMFILE
+For
+.BR F_DUPFD ,
+the process already has the maximum number of file descriptors open.
+.TP
+.B ENOLCK
+Too many segment locks open, lock table is full, or a remote locking
+protocol failed (e.g. locking over NFS).
+.TP
+.B EPERM
+Attempted to clear the
+.B O_APPEND
+flag on a file that has the append-only attribute set.
+.SH NOTES
+The errors returned by
+.B dup2
+are different from those returned by
+.BR F_DUPFD .
+
+Since kernel 2.0, there is no interaction between the types of lock
+placed by
+.BR flock (2)
+and
+.BR fcntl (2).
+
+POSIX 1003.1-2001 allows
+.I l_len
+to be negative. (And if it is, the interval described by the lock
+covers bytes
+.IR l_start + l_len
+up to and including
+.IR l_start -1.)
+This is supported by Linux since Linux 2.4.21 and 2.5.49.
+
+Several systems have more fields in
+.I "struct flock"
+such as e.g.
+.IR l_sysid .
+Clearly,
+.I l_pid
+alone is not going to be very useful if the process holding the lock
+may live on a different machine.
+
+.SH "CONFORMING TO"
+SVr4, SVID, POSIX, X/OPEN, BSD 4.3. Only the operations F_DUPFD,
+F_GETFD, F_SETFD, F_GETFL, F_SETFL, F_GETLK, F_SETLK and F_SETLKW are
+specified in POSIX.1. F_GETOWN and F_SETOWN are BSDisms not supported
+in SVr4; F_GETSIG and F_SETSIG are specific to Linux.
+.BR F_NOTIFY ", " F_GETLEASE ", and " F_SETLEASE
+are Linux specific.
+(Define the _GNU_SOURCE macro before including <fcntl.h> to
+obtain these definitions.)
+The flags legal for F_GETFL/F_SETFL are those supported by
+.BR open (2)
+and vary between these systems; O_APPEND, O_NONBLOCK, O_RDONLY,
+and O_RDWR are specified in POSIX.1. SVr4 supports several other
+options and flags not documented here.
+.PP
+SVr4 documents additional EIO, ENOLINK and EOVERFLOW error conditions.
+.SH "SEE ALSO"
+.BR dup2 (2),
+.BR flock (2),
+.BR open (2),
+.BR socket (2),
+.BR lockf (3),
+.BR capabilities (7)
+.P
+See also locks.txt, mandatory.txt, and dnotify.txt in
+/usr/src/linux/Documentation.