1044 lines
27 KiB
Groff
1044 lines
27 KiB
Groff
|
.\"
|
||
|
.\" Copyright (c) 2011-2022 Apple Inc. All rights reserved.
|
||
|
.\"
|
||
|
.\" @APPLE_LICENSE_HEADER_START@
|
||
|
.\"
|
||
|
.\" This file contains Original Code and/or Modifications of Original Code
|
||
|
.\" as defined in and that are subject to the Apple Public Source License
|
||
|
.\" Version 2.0 (the 'License'). You may not use this file except in
|
||
|
.\" compliance with the License. Please obtain a copy of the License at
|
||
|
.\" http://www.opensource.apple.com/apsl/ and read it before using this
|
||
|
.\" file.
|
||
|
.\"
|
||
|
.\" The Original Code and all software distributed under the License are
|
||
|
.\" distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
||
|
.\" EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
||
|
.\" INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
|
||
|
.\" FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
|
||
|
.\" Please see the License for the specific language governing rights and
|
||
|
.\" limitations under the License.
|
||
|
.\"
|
||
|
.\" @APPLE_LICENSE_HEADER_END@
|
||
|
.\"
|
||
|
.\"
|
||
|
.\" $NetBSD: fcntl.2,v 1.6 1995/02/27 12:32:29 cgd Exp $
|
||
|
.\"
|
||
|
.\" Copyright (c) 1983, 1993
|
||
|
.\" The Regents of the University of California. All rights reserved.
|
||
|
.\"
|
||
|
.\" Redistribution and use in source and binary forms, with or without
|
||
|
.\" modification, are permitted provided that the following conditions
|
||
|
.\" are met:
|
||
|
.\" 1. Redistributions of source code must retain the above copyright
|
||
|
.\" notice, this list of conditions and the following disclaimer.
|
||
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||
|
.\" notice, this list of conditions and the following disclaimer in the
|
||
|
.\" documentation and/or other materials provided with the distribution.
|
||
|
.\" 3. All advertising materials mentioning features or use of this software
|
||
|
.\" must display the following acknowledgement:
|
||
|
.\" This product includes software developed by the University of
|
||
|
.\" California, Berkeley and its contributors.
|
||
|
.\" 4. Neither the name of the University nor the names of its contributors
|
||
|
.\" may be used to endorse or promote products derived from this software
|
||
|
.\" without specific prior written permission.
|
||
|
.\"
|
||
|
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||
|
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||
|
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||
|
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||
|
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||
|
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||
|
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||
|
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||
|
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||
|
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||
|
.\" SUCH DAMAGE.
|
||
|
.\"
|
||
|
.\" @(#)fcntl.2 8.2 (Berkeley) 1/12/94
|
||
|
.\"
|
||
|
.Dd August 12, 2021
|
||
|
.Dt FCNTL 2
|
||
|
.Os BSD 4.2
|
||
|
.Sh NAME
|
||
|
.Nm fcntl
|
||
|
.Nd file control
|
||
|
.Sh SYNOPSIS
|
||
|
.Fd #include <fcntl.h>
|
||
|
.Ft int
|
||
|
.Fo fcntl
|
||
|
.Fa "int fildes"
|
||
|
.Fa "int cmd"
|
||
|
.Fa "..."
|
||
|
.Fc
|
||
|
.Sh DESCRIPTION
|
||
|
.Fn fcntl
|
||
|
provides for control over descriptors.
|
||
|
The argument
|
||
|
.Fa fildes
|
||
|
is a descriptor to be operated on by
|
||
|
.Fa cmd
|
||
|
as follows:
|
||
|
.Bl -tag -width F_GETPATH_NOFIRMLINKX
|
||
|
.It Dv F_DUPFD
|
||
|
Return a new descriptor as follows:
|
||
|
.Pp
|
||
|
.Bl -bullet -compact -offset 4n
|
||
|
.It
|
||
|
Lowest numbered available descriptor greater than or equal to
|
||
|
.Fa arg .
|
||
|
.It
|
||
|
Same object references as the original descriptor.
|
||
|
.It
|
||
|
New descriptor shares the same file offset if the object
|
||
|
was a file.
|
||
|
.It
|
||
|
Same access mode (read, write or read/write).
|
||
|
.It
|
||
|
Same file status flags (i.e., both file descriptors
|
||
|
share the same file status flags).
|
||
|
.It
|
||
|
The close-on-exec flag associated with the new file descriptor
|
||
|
is cleared so that the descriptor remains open across an
|
||
|
.Xr execv 2
|
||
|
system call.
|
||
|
.El
|
||
|
.It Dv F_DUPFD_CLOEXEC
|
||
|
Like
|
||
|
.Dv F_DUPFD ,
|
||
|
except that the close-on-exec flag associated with the new file descriptor
|
||
|
is set.
|
||
|
.It Dv F_GETFD
|
||
|
Get the flags associated with the file descriptor
|
||
|
.Fa fildes ,
|
||
|
as described below
|
||
|
.Fa ( arg
|
||
|
is ignored).
|
||
|
.It Dv F_SETFD
|
||
|
Set the file descriptor flags to
|
||
|
.Fa arg .
|
||
|
.It Dv F_GETFL
|
||
|
Get descriptor status flags, as described below
|
||
|
.Fa ( arg
|
||
|
is ignored).
|
||
|
.It Dv F_SETFL
|
||
|
Set descriptor status flags to
|
||
|
.Fa arg .
|
||
|
.It Dv F_GETOWN
|
||
|
Get the process ID or process group
|
||
|
currently receiving
|
||
|
.Dv SIGIO
|
||
|
and
|
||
|
.Dv SIGURG
|
||
|
signals; process groups are returned
|
||
|
as negative values
|
||
|
.Fa ( arg
|
||
|
is ignored).
|
||
|
.It Dv F_SETOWN
|
||
|
Set the process or process group
|
||
|
to receive
|
||
|
.Dv SIGIO
|
||
|
and
|
||
|
.Dv SIGURG
|
||
|
signals;
|
||
|
process groups are specified by supplying
|
||
|
.Fa arg
|
||
|
as negative, otherwise
|
||
|
.Fa arg
|
||
|
is interpreted as a process ID.
|
||
|
.It Dv F_GETPATH
|
||
|
Get the path of the file descriptor
|
||
|
.Fa fildes .
|
||
|
The argument must be a buffer of size
|
||
|
.Sy MAXPATHLEN
|
||
|
or greater.
|
||
|
.It Dv F_GETPATH_NOFIRMLINK
|
||
|
Get the non firmlinked path of the file descriptor
|
||
|
.Fa fildes .
|
||
|
The argument must be a buffer of size
|
||
|
.Sy MAXPATHLEN
|
||
|
or greater.
|
||
|
.It Dv F_PREALLOCATE
|
||
|
Preallocate file storage space.
|
||
|
Note: upon success, the space that is allocated can be the size requested,
|
||
|
larger than the size requested, or (if the
|
||
|
.Dv F_ALLOCATEALL
|
||
|
flag is not provided) smaller than the space requested.
|
||
|
.It Dv F_PUNCHHOLE
|
||
|
Deallocate a region and replace it with a hole. Subsequent reads of the
|
||
|
affected region will return bytes of zeros that are usually not backed by
|
||
|
physical blocks. This will not change the actual file size. Holes must be
|
||
|
aligned to file system block boundaries. This will fail on
|
||
|
file systems that do not support this interface.
|
||
|
.It Dv F_SETSIZE
|
||
|
Deprecated.
|
||
|
In previous releases, this would allow a process with root privileges to
|
||
|
truncate a file without zeroing space.
|
||
|
For security reasons, this operation is no longer supported and will
|
||
|
instead truncate the file in the same manner as
|
||
|
.Xr truncate 2 .
|
||
|
.It Dv F_RDADVISE
|
||
|
Issue an advisory read async with no copy to user.
|
||
|
.It Dv F_RDAHEAD
|
||
|
Turn read ahead off/on.
|
||
|
A zero value in
|
||
|
.Fa arg
|
||
|
disables read ahead.
|
||
|
A non-zero value in
|
||
|
.Fa arg
|
||
|
turns read ahead on.
|
||
|
.It Dv F_NOCACHE
|
||
|
Turns data caching off/on. A non-zero value in
|
||
|
.Fa arg
|
||
|
turns data caching off.
|
||
|
A value of zero in
|
||
|
.Fa arg
|
||
|
turns data caching on.
|
||
|
.It Dv F_LOG2PHYS
|
||
|
Get disk device information.
|
||
|
Currently this only returns the
|
||
|
disk device address that corresponds
|
||
|
to the current file offset. Note that the system
|
||
|
may return -1 as the disk device address if the file is not
|
||
|
backed by physical blocks. This is subject
|
||
|
to change.
|
||
|
.It Dv F_LOG2PHYS_EXT
|
||
|
Variant of F_LOG2PHYS that uses the passed in
|
||
|
file offset and length.
|
||
|
.It Dv F_BARRIERFSYNC
|
||
|
Does the same thing as
|
||
|
.Xr fsync 2
|
||
|
then issues a barrier command to the drive
|
||
|
.Fa ( arg
|
||
|
is ignored).
|
||
|
The barrier applies to I/O that have been flushed with
|
||
|
.Xr fsync 2
|
||
|
on the same device before. These operations are guaranteed to
|
||
|
be persisted before any other I/O that would follow the barrier,
|
||
|
although no assumption should be made on what has been persisted
|
||
|
or not when this call returns. After the barrier has been issued,
|
||
|
operations on other FDs that have been fsync'd before can still be
|
||
|
re-ordered by the device, but not after the barrier. This is
|
||
|
typically useful to guarantee valid state on disk when ordering is a
|
||
|
concern but durability is not. A barrier can be used to order two phases of operations on
|
||
|
a set of file descriptors and ensure that no file can possibly get persisted
|
||
|
with the effect of the second phase without the effect of the first one. To do so,
|
||
|
execute operations of phase one, then
|
||
|
.Xr fsync 2
|
||
|
each FD and issue a single barrier. Finally execute operations of phase two.
|
||
|
This is currently implemented on HFS and APFS. It requires hardware support,
|
||
|
which Apple SSDs are guaranteed to provide.
|
||
|
.It Dv F_FULLFSYNC
|
||
|
Does the same thing as
|
||
|
.Xr fsync 2
|
||
|
then asks the drive to
|
||
|
flush all buffered data to
|
||
|
the permanent storage device
|
||
|
.Fa ( arg
|
||
|
is ignored).
|
||
|
As this drains the entire queue of the device and acts as a
|
||
|
barrier, data that had been fsync'd on the same device before
|
||
|
is guaranteed to be persisted when this call returns.
|
||
|
This is currently implemented on HFS, MS-DOS (FAT),
|
||
|
Universal Disk Format (UDF) and APFS file systems.
|
||
|
The operation may take quite a while to complete.
|
||
|
Certain FireWire drives have also been known
|
||
|
to ignore the request to flush their buffered data.
|
||
|
.It Dv F_SETNOSIGPIPE
|
||
|
Determines whether a
|
||
|
.Dv SIGPIPE
|
||
|
signal will be generated when a write fails on a pipe or socket for
|
||
|
which there is no reader. If
|
||
|
.Fa arg
|
||
|
is non-zero,
|
||
|
.Dv SIGPIPE
|
||
|
generation is disabled for descriptor
|
||
|
.Fa fildes ,
|
||
|
while an
|
||
|
.Fa arg
|
||
|
of zero enables it (the default).
|
||
|
.It Dv F_GETNOSIGPIPE
|
||
|
Returns whether a
|
||
|
.Dv SIGPIPE
|
||
|
signal will be generated when a write fails on a pipe or socket
|
||
|
for which there is no reader. The semantics of the return value
|
||
|
match those of the
|
||
|
.Fa arg
|
||
|
of
|
||
|
.Dv F_SETNOSIGPIPE .
|
||
|
.It Dv F_TRANSFEREXTENTS
|
||
|
Transfer any extra space in the file past the logical EOF (as previously
|
||
|
allocated via
|
||
|
.Dv F_PREALLOCATE )
|
||
|
to another file. The other file is specified via a file descriptor
|
||
|
as the lone extra argument. Both descriptors must reference regular
|
||
|
files in the same volume.
|
||
|
.El
|
||
|
.Pp
|
||
|
The flags for the
|
||
|
.Dv F_GETFD
|
||
|
and
|
||
|
.Dv F_SETFD
|
||
|
commands are as follows:
|
||
|
.Bl -tag -width FD_CLOEXECX -offset indent
|
||
|
.It Dv FD_CLOEXEC
|
||
|
Close-on-exec; the given file descriptor will be automatically
|
||
|
closed in the successor process image when one of the
|
||
|
.Xr execv 2
|
||
|
or
|
||
|
.Xr posix_spawn 2
|
||
|
family of system calls is invoked.
|
||
|
.El
|
||
|
.Pp
|
||
|
The flags for the
|
||
|
.Dv F_GETFL
|
||
|
and
|
||
|
.Dv F_SETFL
|
||
|
commands are as follows:
|
||
|
.Bl -tag -width O_NONBLOCKX -offset indent
|
||
|
.It Dv O_NONBLOCK
|
||
|
Non-blocking I/O; if no data is available to a
|
||
|
.Xr read 2
|
||
|
call, or if a
|
||
|
.Xr write 2
|
||
|
operation would block,
|
||
|
the read or write call returns -1 with the error
|
||
|
.Er EAGAIN .
|
||
|
.It Dv O_APPEND
|
||
|
Force each write to append at the end of file;
|
||
|
corresponds to the
|
||
|
.Dv O_APPEND
|
||
|
flag of
|
||
|
.Xr open 2 .
|
||
|
.It Dv O_ASYNC
|
||
|
Enable the
|
||
|
.Dv SIGIO
|
||
|
signal to be sent to the process group
|
||
|
when I/O is possible, e.g.,
|
||
|
upon availability of data to be read.
|
||
|
.El
|
||
|
.Pp
|
||
|
Several commands are available for doing advisory file locking;
|
||
|
they all operate on the following structure:
|
||
|
.ne 7v
|
||
|
.Bd -literal
|
||
|
struct flock {
|
||
|
off_t l_start; /* starting offset */
|
||
|
off_t l_len; /* len = 0 means until end of file */
|
||
|
pid_t l_pid; /* lock owner */
|
||
|
short l_type; /* lock type: read/write, etc. */
|
||
|
short l_whence; /* type of l_start */
|
||
|
};
|
||
|
.Ed
|
||
|
.Pp
|
||
|
The commands available for advisory record locking are as follows:
|
||
|
.Bl -tag -width F_SETLKWX
|
||
|
.It Dv F_GETLK
|
||
|
Get the first lock that blocks the lock description pointed to by the
|
||
|
third argument,
|
||
|
.Fa arg ,
|
||
|
taken as a pointer to a
|
||
|
.Fa "struct flock"
|
||
|
(see above).
|
||
|
The information retrieved overwrites the information passed to
|
||
|
.Nm fcntl
|
||
|
in the
|
||
|
.Fa flock
|
||
|
structure.
|
||
|
If no lock is found that would prevent this lock from being created,
|
||
|
the structure is left unchanged by this function call except for the
|
||
|
lock type which is set to
|
||
|
.Dv F_UNLCK .
|
||
|
If a lock that does not support the discovery of lock ownership by process
|
||
|
(such as an OFD lock (see below), one created by the
|
||
|
.Xr flock 2
|
||
|
system call or the
|
||
|
.Xr open 2
|
||
|
system call with the
|
||
|
.Dv O_SHLOCK
|
||
|
or
|
||
|
.Dv O_EXLOCK
|
||
|
flag) is found,
|
||
|
.Fa l_pid
|
||
|
is set to -1.
|
||
|
.It Dv F_SETLK
|
||
|
Set or clear a file segment lock according to the lock description
|
||
|
pointed to by the third argument,
|
||
|
.Fa arg ,
|
||
|
taken as a pointer to a
|
||
|
.Fa "struct flock"
|
||
|
(see above).
|
||
|
.Dv F_SETLK
|
||
|
is used to establish shared (or read) locks
|
||
|
.Dv (F_RDLCK)
|
||
|
or exclusive (or write) locks,
|
||
|
.Dv (F_WRLCK) ,
|
||
|
as well as remove either type of lock
|
||
|
.Dv (F_UNLCK) .
|
||
|
If a shared or exclusive lock cannot be set,
|
||
|
.Nm fcntl
|
||
|
returns immediately with
|
||
|
.Er EAGAIN .
|
||
|
.It Dv F_SETLKW
|
||
|
This command is the same as
|
||
|
.Dv F_SETLK
|
||
|
except that if a shared or exclusive lock is blocked by other locks,
|
||
|
the thread waits until the request can be satisfied.
|
||
|
If a signal that is to be caught is received while
|
||
|
.Nm fcntl
|
||
|
is waiting for a region, the
|
||
|
.Nm fcntl
|
||
|
will be interrupted if the signal handler has not specified the
|
||
|
.Dv SA_RESTART
|
||
|
(see
|
||
|
.Xr sigaction 2 ) .
|
||
|
.El
|
||
|
.Pp
|
||
|
When a shared lock has been set on a segment of a file,
|
||
|
other processes can set shared locks on that segment
|
||
|
or a portion of it.
|
||
|
A shared lock prevents any other process from setting an exclusive
|
||
|
lock on any portion of the protected area.
|
||
|
A request for a shared lock fails if the file descriptor was not
|
||
|
opened with read access.
|
||
|
.Pp
|
||
|
An exclusive lock prevents any other process from setting a shared lock or
|
||
|
an exclusive lock on any portion of the protected area.
|
||
|
A request for an exclusive lock fails if the file was not
|
||
|
opened with write access.
|
||
|
.Pp
|
||
|
The value of
|
||
|
.Fa l_whence
|
||
|
is
|
||
|
.Dv SEEK_SET ,
|
||
|
.Dv SEEK_CUR ,
|
||
|
or
|
||
|
.Dv SEEK_END
|
||
|
to indicate that the relative offset,
|
||
|
.Fa l_start
|
||
|
bytes, will be measured from the start of the file,
|
||
|
current position, or end of the file, respectively.
|
||
|
The value of
|
||
|
.Fa l_len
|
||
|
is the number of consecutive bytes to be locked.
|
||
|
If
|
||
|
.Fa l_len
|
||
|
is negative, the result is undefined.
|
||
|
The
|
||
|
.Fa l_pid
|
||
|
field is only used with
|
||
|
.Dv F_GETLK
|
||
|
to return the process ID of the process holding a blocking lock.
|
||
|
After a successful
|
||
|
.Dv F_GETLK
|
||
|
request, the value of
|
||
|
.Fa l_whence
|
||
|
is
|
||
|
.Dv SEEK_SET .
|
||
|
.Pp
|
||
|
Locks may start and extend beyond the current end of a file,
|
||
|
but may not start or extend before the beginning of the file.
|
||
|
A lock is set to extend to the largest possible value of the
|
||
|
file offset for that file if
|
||
|
.Fa l_len
|
||
|
is set to zero. If
|
||
|
.Fa l_whence
|
||
|
and
|
||
|
.Fa l_start
|
||
|
point to the beginning of the file, and
|
||
|
.Fa l_len
|
||
|
is zero, the entire file is locked.
|
||
|
If an application wishes only to do entire file locking, the
|
||
|
.Xr flock 2
|
||
|
system call is more efficient.
|
||
|
.Pp
|
||
|
There is at most one type of lock set for each byte in the file.
|
||
|
Before a successful return from an
|
||
|
.Dv F_SETLK
|
||
|
or an
|
||
|
.Dv F_SETLKW
|
||
|
request when the calling process has previously existing locks
|
||
|
on bytes in the region specified by the request,
|
||
|
the previous lock type for each byte in the specified
|
||
|
region is replaced by the new lock type.
|
||
|
As specified above under the descriptions
|
||
|
of shared locks and exclusive locks, an
|
||
|
.Dv F_SETLK
|
||
|
or an
|
||
|
.Dv F_SETLKW
|
||
|
request fails or blocks respectively when another process has existing
|
||
|
locks on bytes in the specified region and the type of any of those
|
||
|
locks conflicts with the type specified in the request.
|
||
|
.Pp
|
||
|
This interface follows the completely stupid semantics of System V and
|
||
|
.St -p1003.1-88
|
||
|
that require that all locks associated with a file for a given process are
|
||
|
removed when \fIany\fP file descriptor for that file is closed by that process.
|
||
|
This semantic means that applications must be aware of any files that
|
||
|
a subroutine library may access.
|
||
|
For example if an application for updating the password file locks the
|
||
|
password file database while making the update, and then calls
|
||
|
.Xr getpwnam 3
|
||
|
to retrieve a record,
|
||
|
the lock will be lost because
|
||
|
.Xr getpwnam 3
|
||
|
opens, reads, and closes the password database.
|
||
|
The database close will release all locks that the process has
|
||
|
associated with the database, even if the library routine never
|
||
|
requested a lock on the database.
|
||
|
Another minor semantic problem with this interface is that
|
||
|
locks are not inherited by a child process created using the
|
||
|
.Xr fork 2
|
||
|
function.
|
||
|
The
|
||
|
.Xr flock 2
|
||
|
interface has much more rational last close semantics and
|
||
|
allows locks to be inherited by child processes.
|
||
|
.Xr Flock 2
|
||
|
is recommended for applications that want to ensure the integrity
|
||
|
of their locks when using library routines or wish to pass locks
|
||
|
to their children.
|
||
|
Note that
|
||
|
.Xr flock 2
|
||
|
and
|
||
|
.Nm fcntl
|
||
|
locks may be safely used concurrently.
|
||
|
.Pp
|
||
|
All locks associated with a file for a given process are
|
||
|
removed when the process terminates.
|
||
|
.Pp
|
||
|
A potential for deadlock occurs if a process controlling a locked region
|
||
|
is put to sleep by attempting to lock the locked region of another process.
|
||
|
This implementation detects that sleeping until a locked region is unlocked
|
||
|
would cause a deadlock and fails with an
|
||
|
.Er EDEADLK
|
||
|
error.
|
||
|
.Pp
|
||
|
An alternative set of commands is available for advisory record locking;
|
||
|
they operate on the same
|
||
|
.Fa flock
|
||
|
structure described above, the fields of the structure have the same
|
||
|
semantics, and the commands behave similarly to the traditional record
|
||
|
locks described above.
|
||
|
The primary difference is that
|
||
|
.Em open file description
|
||
|
(OFD) locks are locks on the file associated with the open file description
|
||
|
used to acquire them, and not with the process that created them.
|
||
|
OFD locks are conceptually similar to locks managed by
|
||
|
.Xr flock 2 ,
|
||
|
with the addition of record locking capabilities.
|
||
|
.Pp
|
||
|
A new open file description can be obtained from e.g.,
|
||
|
.Xr open 2 .
|
||
|
However, file descriptors that have been duplicated using e.g.,
|
||
|
.Xr dup 2
|
||
|
or
|
||
|
.Xr fork 2
|
||
|
do
|
||
|
.Sy not
|
||
|
result in multiple instances of a lock, but create additional
|
||
|
references to the same open file description, and thus reference the same lock.
|
||
|
For example, if a process holding an OFD lock on a file forks, and the child
|
||
|
explicitly unlocks a record, the parent will also lose that lock on the
|
||
|
same record.
|
||
|
.Pp
|
||
|
Only the last close of the last file descriptor in any process still
|
||
|
referencing the open file description causes an automatic unlock to occur,
|
||
|
so this type of record lock avoids the more unfortunate
|
||
|
.Xr close 2
|
||
|
semantics of traditional advisory record locks.
|
||
|
.Pp
|
||
|
The commands used for OFD locks are direct analogs of traditional
|
||
|
record locking commands:
|
||
|
.\"
|
||
|
.Bl -tag -width F_OFD_SETLKWX
|
||
|
.It Dv F_OFD_GETLK
|
||
|
Get the first lock that blocks the lock description pointed to by the
|
||
|
third argument,
|
||
|
.Fa arg ,
|
||
|
taken as a pointer to a
|
||
|
.Fa "struct flock"
|
||
|
(see above).
|
||
|
The information retrieved overwrites the information passed to
|
||
|
.Nm fcntl
|
||
|
in the
|
||
|
.Fa flock
|
||
|
structure.
|
||
|
If no lock is found that would prevent this lock from being created,
|
||
|
the structure is left unchanged by this function call except for the
|
||
|
lock type which is set to
|
||
|
.Dv F_UNLCK .
|
||
|
If a lock that does not support the discovery of lock ownership by process
|
||
|
(such as an OFD lock, one created by the
|
||
|
.Xr flock 2
|
||
|
system call or the
|
||
|
.Xr open 2
|
||
|
system call with the
|
||
|
.Dv O_SHLOCK
|
||
|
or
|
||
|
.Dv O_EXLOCK
|
||
|
flag) is found,
|
||
|
.Fa l_pid
|
||
|
is set to -1.
|
||
|
.\"
|
||
|
.It Dv F_OFD_SETLK
|
||
|
Set or clear a file segment lock according to the lock description
|
||
|
pointed to by the third argument,
|
||
|
.Fa arg ,
|
||
|
taken as a pointer to a
|
||
|
.Fa "struct flock"
|
||
|
(see above).
|
||
|
.Dv F_SETLK
|
||
|
is used to establish shared (or read) locks
|
||
|
.Dv (F_RDLCK)
|
||
|
or exclusive (or write) locks,
|
||
|
.Dv (F_WRLCK) ,
|
||
|
as well as remove either type of lock
|
||
|
.Dv (F_UNLCK) .
|
||
|
If a shared or exclusive lock cannot be set,
|
||
|
.Nm fcntl
|
||
|
returns immediately with a return value of -1.
|
||
|
.\"
|
||
|
.It Dv F_OFD_SETLKW
|
||
|
This command is the same as
|
||
|
.Dv F_OFD_SETLK
|
||
|
except that if a shared or exclusive lock is blocked by other locks,
|
||
|
the thread waits until the request can be satisfied.
|
||
|
If a signal that is to be caught is received while
|
||
|
.Nm fcntl
|
||
|
is waiting for a region, the
|
||
|
.Nm fcntl
|
||
|
will be interrupted if the signal handler has not specified the
|
||
|
.Dv SA_RESTART
|
||
|
(see
|
||
|
.Xr sigaction 2 ) .
|
||
|
.El
|
||
|
.\"
|
||
|
.Pp
|
||
|
No deadlock detection is performed for OFD file locks.
|
||
|
.\"
|
||
|
.Pp
|
||
|
The
|
||
|
.Dv F_PREALLOCATE
|
||
|
command operates on the following structure:
|
||
|
.ne 7v
|
||
|
.Bd -literal
|
||
|
typedef struct fstore {
|
||
|
u_int32_t fst_flags; /* IN: flags word */
|
||
|
int fst_posmode; /* IN: indicates offset field */
|
||
|
off_t fst_offset; /* IN: start of the region */
|
||
|
off_t fst_length; /* IN: size of the region */
|
||
|
off_t fst_bytesalloc; /* OUT: number of bytes allocated */
|
||
|
} fstore_t;
|
||
|
.Ed
|
||
|
.Pp
|
||
|
The flags (fst_flags) for the
|
||
|
.Dv F_PREALLOCATE
|
||
|
command are as follows:
|
||
|
.Bl -tag -width F_ALLOCATECONTIGX -offset indent
|
||
|
.It Dv F_ALLOCATECONTIG
|
||
|
Allocate contiguous space. (Note that the file system may ignore this request if
|
||
|
.Fa fst_length
|
||
|
is very large.)
|
||
|
.It Dv F_ALLOCATEALL
|
||
|
Allocate all requested space or no space at all.
|
||
|
.It Dv F_ALLOCATEPERSIST
|
||
|
Allocate space that is not freed when
|
||
|
.Xr close 2
|
||
|
is called. (Note that the file system may ignore this request.)
|
||
|
.El
|
||
|
.Pp
|
||
|
The position modes (fst_posmode) for the
|
||
|
.Dv F_PREALLOCATE
|
||
|
command indicate how to use the offset field.
|
||
|
The modes are as follows:
|
||
|
.Bl -tag -width F_PEOFPOSMODEX -offset indent
|
||
|
.It Dv F_PEOFPOSMODE
|
||
|
Allocate from the physical end of file.
|
||
|
In this case,
|
||
|
.Fa fst_length
|
||
|
indicates the number of newly allocated bytes desired.
|
||
|
.It Dv F_VOLPOSMODE
|
||
|
Allocate from the volume offset.
|
||
|
.El
|
||
|
.Pp
|
||
|
The
|
||
|
.Dv F_PUNCHHOLE
|
||
|
command operates on the following structure:
|
||
|
.ne 7v
|
||
|
.Bd -literal
|
||
|
typedef struct fpunchhole {
|
||
|
u_int32_t fp_flags; /* unused */
|
||
|
u_int32_t reserved; /* (to maintain 8-byte alignment) */
|
||
|
off_t fp_offset; /* IN: start of the region */
|
||
|
off_t fp_length; /* IN: size of the region */
|
||
|
} fpunchhole_t;
|
||
|
.Ed
|
||
|
.Pp
|
||
|
The
|
||
|
.Dv F_RDADVISE
|
||
|
command operates on the following structure
|
||
|
which holds information passed from the
|
||
|
user to the system:
|
||
|
.ne 7v
|
||
|
.Bd -literal
|
||
|
struct radvisory {
|
||
|
off_t ra_offset; /* offset into the file */
|
||
|
int ra_count; /* size of the read */
|
||
|
};
|
||
|
.Ed
|
||
|
.Pp
|
||
|
The
|
||
|
.Dv F_LOG2PHYS
|
||
|
command operates on the following structure:
|
||
|
.ne 7v
|
||
|
.Bd -literal
|
||
|
struct log2phys {
|
||
|
u_int32_t l2p_flags; /* unused so far */
|
||
|
off_t l2p_contigbytes; /* unused so far */
|
||
|
off_t l2p_devoffset; /* bytes into device */
|
||
|
};
|
||
|
.Ed
|
||
|
.Pp
|
||
|
The
|
||
|
.Dv F_LOG2PHYS_EXT
|
||
|
command operates on the same structure as F_LOG2PHYS but treats it as an in/out:
|
||
|
.ne 7v
|
||
|
.Bd -literal
|
||
|
struct log2phys {
|
||
|
u_int32_t l2p_flags; /* unused so far */
|
||
|
off_t l2p_contigbytes; /* IN: number of bytes to be queried;
|
||
|
OUT: number of contiguous bytes allocated at this position */
|
||
|
off_t l2p_devoffset; /* IN: bytes into file;
|
||
|
OUT: bytes into device */
|
||
|
};
|
||
|
.Ed
|
||
|
.Pp
|
||
|
If
|
||
|
.Fa fildes
|
||
|
is a socket, then the
|
||
|
.Dv F_SETNOSIGPIPE
|
||
|
and
|
||
|
.Dv F_GETNOSIGPIPE
|
||
|
commands are directly analogous, and fully interoperate with the
|
||
|
.Dv SO_NOSIGPIPE
|
||
|
option of
|
||
|
.Xr setsockopt 2
|
||
|
and
|
||
|
.Xr getsockopt 2
|
||
|
respectively.
|
||
|
.Sh RETURN VALUES
|
||
|
Upon successful completion, the value returned depends on
|
||
|
.Fa cmd
|
||
|
as follows:
|
||
|
.Bl -tag -width F_GETOWNX -offset indent
|
||
|
.It Dv F_DUPFD
|
||
|
A new file descriptor.
|
||
|
.It Dv F_GETFD
|
||
|
Value of flag (only the low-order bit is defined).
|
||
|
.It Dv F_GETFL
|
||
|
Value of flags.
|
||
|
.It Dv F_GETOWN
|
||
|
Value of file descriptor owner.
|
||
|
.It other
|
||
|
Value other than -1.
|
||
|
.El
|
||
|
.Pp
|
||
|
Otherwise, a value of -1 is returned and
|
||
|
.Va errno
|
||
|
is set to indicate the error.
|
||
|
.Sh ERRORS
|
||
|
The
|
||
|
.Fn fcntl
|
||
|
system call will fail if:
|
||
|
.Bl -tag -width Er
|
||
|
.\" ==========
|
||
|
.It Bq Er EAGAIN
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_SETLK
|
||
|
or
|
||
|
.Dv F_OFD_SETLK ,
|
||
|
the type of lock
|
||
|
.Fa (l_type)
|
||
|
is a shared lock
|
||
|
.Dv (F_RDLCK)
|
||
|
or exclusive lock
|
||
|
.Dv (F_WRLCK) ,
|
||
|
and the segment of a file to be locked is already
|
||
|
exclusive-locked by another process;
|
||
|
or the type is an exclusive lock and some portion of the
|
||
|
segment of a file to be locked is already shared-locked or
|
||
|
exclusive-locked by another process.
|
||
|
.It Bq Er EACCES
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_SETSIZE
|
||
|
and the calling process does not have root privileges.
|
||
|
.\" ==========
|
||
|
.It Bq Er EBADF
|
||
|
.Fa Fildes
|
||
|
is not a valid open file descriptor.
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_SETLK ,
|
||
|
.Dv F_SETLKW ,
|
||
|
.Dv F_OFD_SETLK
|
||
|
or
|
||
|
.Dv F_OFD_SETLKW ,
|
||
|
the type of lock
|
||
|
.Fa (l_type)
|
||
|
is a shared lock
|
||
|
.Dv (F_RDLCK) ,
|
||
|
and
|
||
|
.Fa fildes
|
||
|
is not a valid file descriptor open for reading.
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_SETLK ,
|
||
|
.Dv F_SETLKW ,
|
||
|
.Dv F_OFD_SETLK
|
||
|
or
|
||
|
.Dv F_OFD_SETLKW ,
|
||
|
the type of lock
|
||
|
.Fa (l_type)
|
||
|
is an exclusive lock
|
||
|
.Dv (F_WRLCK) ,
|
||
|
and
|
||
|
.Fa fildes
|
||
|
is not a valid file descriptor open for writing.
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_PREALLOCATE
|
||
|
and the calling process does not have
|
||
|
file write permission.
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_LOG2PHYS
|
||
|
or
|
||
|
.Dv F_LOG2PHYS_EXT
|
||
|
and
|
||
|
.Fa fildes
|
||
|
is not a valid file descriptor open for reading.
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_TRANSFEREXTENTS
|
||
|
and either file descriptor does not correspond to a valid
|
||
|
regular file, or either file is not open for writing.
|
||
|
.\" ==========
|
||
|
.It Bq Er EDEADLK
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_SETLKW ,
|
||
|
and a deadlock condition was detected.
|
||
|
.\" ==========
|
||
|
.It Bq Er EFBIG
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_PREALLOCATE ,
|
||
|
.Dv F_PEOFPOSMODE
|
||
|
is set and preallocating
|
||
|
.Fa fst_length
|
||
|
bytes on
|
||
|
.Fa fildes
|
||
|
would exceed the maximum file size.
|
||
|
.\" ==========
|
||
|
.It Bq Er EINTR
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_SETLKW
|
||
|
or
|
||
|
.Dv F_OFD_SETLKW ,
|
||
|
and the function was interrupted by a signal.
|
||
|
.\" ==========
|
||
|
.It Bq Er EINVAL
|
||
|
.Fa Cmd
|
||
|
is
|
||
|
.Dv F_DUPFD
|
||
|
and
|
||
|
.Fa arg
|
||
|
is negative or greater than the maximum allowable number
|
||
|
(see
|
||
|
.Xr getdtablesize 2 ) .
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_GETLK ,
|
||
|
.Dv F_SETLK ,
|
||
|
.Dv F_SETLKW ,
|
||
|
.Dv F_OFD_GETLK ,
|
||
|
.Dv F_OFD_SETLK
|
||
|
or
|
||
|
.Dv F_OFD_SETLKW ,
|
||
|
and the data to which
|
||
|
.Fa arg
|
||
|
points is not valid, or
|
||
|
.Fa fildes
|
||
|
refers to a file that does not support locking.
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_PREALLOCATE
|
||
|
and the
|
||
|
.Fa fst_posmode
|
||
|
is not a valid mode,
|
||
|
or when
|
||
|
.Dv F_PEOFPOSMODE
|
||
|
is set and
|
||
|
.Fa fst_offset
|
||
|
is a non-zero value,
|
||
|
or when
|
||
|
.Dv F_VOLPOSMODE
|
||
|
is set and
|
||
|
.Fa fst_offset
|
||
|
is a negative or zero value.
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_PUNCHHOLE
|
||
|
and
|
||
|
either
|
||
|
.Fa fp_offset
|
||
|
or
|
||
|
.Fa fp_length
|
||
|
are negative, or when both
|
||
|
.Fa fp_offset
|
||
|
and
|
||
|
.Fa fp_length
|
||
|
are not multiples of the file system block size, or when either
|
||
|
.Fa fp_flags
|
||
|
or
|
||
|
.Fa reserved
|
||
|
is non-zero value.
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_TRANSFEREXTENTS
|
||
|
and the additional file descriptor is negative or both file
|
||
|
descriptors reference the same file.
|
||
|
.\" ==========
|
||
|
.It Bq Er EMFILE
|
||
|
.Fa Cmd
|
||
|
is
|
||
|
.Dv F_DUPFD
|
||
|
and the maximum allowed number of file descriptors are currently
|
||
|
open.
|
||
|
.\" ==========
|
||
|
.It Bq Er EMFILE
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_DUPFD
|
||
|
and the maximum number of file descriptors permitted for the
|
||
|
process are already in use,
|
||
|
or no file descriptors greater than or equal to
|
||
|
.Fa arg
|
||
|
are available.
|
||
|
.\" ==========
|
||
|
.It Bq Er ENOLCK
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_SETLK ,
|
||
|
.Dv F_SETLKW ,
|
||
|
.Dv F_OFD_SETLK
|
||
|
or
|
||
|
.Dv F_OFD_SETLKW ,
|
||
|
and satisfying the lock or unlock request would result in the
|
||
|
number of locked regions in the system exceeding a system-imposed limit.
|
||
|
.\" ==========
|
||
|
.It Bq Er ENOSPC
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_PREALLOCATE
|
||
|
and either there is no space available on the volume containing
|
||
|
.Fa fildes
|
||
|
or
|
||
|
.Fa fst_flags
|
||
|
contains
|
||
|
.Dv F_ALLOCATEALL
|
||
|
and there is not enough space available on the volume containing
|
||
|
.Fa fildes
|
||
|
to satisfy the entire request.
|
||
|
.Pp
|
||
|
The argument
|
||
|
.Fa cmd
|
||
|
is
|
||
|
.Dv F_PUNCHHOLE
|
||
|
and there is not enough space available on the volume containing
|
||
|
.Fa fildes
|
||
|
to satisfy the request. As an example, a filesystem that supports
|
||
|
cloned files may return this error if punching a hole requires the
|
||
|
creation of a clone and there is not enough space available to do so.
|
||
|
.\" ==========
|
||
|
.It Bq Er EOVERFLOW
|
||
|
A return value would overflow its representation.
|
||
|
For example,
|
||
|
.Fa cmd
|
||
|
is F_GETLK, F_SETLK, or F_SETLKW
|
||
|
and the smallest (or, if l_len is non-zero, the largest) offset
|
||
|
of a byte in the requested segment
|
||
|
will not fit in an object of type off_t.
|
||
|
.\" ==========
|
||
|
.It Bq Er EPERM
|
||
|
The argument cmd is
|
||
|
.Dv F_PUNCHHOLE
|
||
|
and the calling process does not have file write permission.
|
||
|
.\" ==========
|
||
|
.It Bq Er ESRCH
|
||
|
.Fa Cmd
|
||
|
is
|
||
|
.Dv F_SETOWN
|
||
|
and
|
||
|
the process ID given as argument is not in use.
|
||
|
.\" ==========
|
||
|
.It Bq Er ENOTSUP
|
||
|
.Fa Cmd
|
||
|
is
|
||
|
.Dv F_TRANSFEREXTENTS
|
||
|
and the given files aren't on an APFS volume.
|
||
|
.\" ==========
|
||
|
.It Bq Er EXDEV
|
||
|
.Fa Cmd
|
||
|
is
|
||
|
.Dv F_TRANSFEREXTENTS
|
||
|
and the referenced files are not in the same volume.
|
||
|
.El
|
||
|
.Sh SEE ALSO
|
||
|
.Xr close 2 ,
|
||
|
.Xr execve 2 ,
|
||
|
.Xr flock 2 ,
|
||
|
.Xr fork 2 ,
|
||
|
.Xr getdtablesize 2 ,
|
||
|
.Xr open 2 ,
|
||
|
.Xr pipe 2 ,
|
||
|
.Xr setsockopt 2 ,
|
||
|
.Xr socket 2 ,
|
||
|
.Xr sigaction 3
|
||
|
.Sh HISTORY
|
||
|
The
|
||
|
.Fn fcntl
|
||
|
function call appeared in
|
||
|
.Bx 4.2 .
|
||
|
.Pp
|
||
|
Open file description locks first appeared in Linux 3.15
|