locking(2) SYSTEM CALLS locking(2)
NAME
locking - locks or unlocks a file region for reading or
writing
SYNOPSIS
cc [flag ...] file ... -lx
locking (int fildes, int mode, long size)
DESCRIPTION
locking allows a specified number of bytes in a file to be
controlled by the locking process. Other processes which
attempt to read or write a portion of the file containing
the locked region may sleep until the area become unlocked
depending upon the mode in which the file region was locked.
A process that attempts to write to or read a file region
that has been locked against reading and writing by another
process (using the LK_LOCK or LK_NBLCK mode) with sleep
until the region of the file has been released by the lock-
ing process. A process that attempts to write to a file
region that has been locked against writing by another pro-
cess (using the LK_RLCK or LK_NBRLCK mode) will sleep until
the region of the file has been released by the locking pro-
cess, but a read request for that file region will proceed
normally. A process that attempts to lock a region of a
file that contains areas that have been locked by other
processes will sleep if it has specified the LK_LOCK or
LK_RLCK mode in its lock request, but will return with the
error EACCES if it specified LK_NBLCK or LK_NBRLCK. fildes
is the value returned from a successful create, open, dup,
or pipe system call. mode specifies the type of lock opera-
tion to be performed on the file region. The available
values for mode are:
LK_UNLCK 0
Unlocks the specified region. The calling process
releases a region of the file it has previously
locked.
LK_LOCK 1 Locks the specified region. The calling process
will sleep until the entire region is available if
any part of it has been locked by a different pro-
cess. The region is then locked for the calling
process and no other process may read or write in
any part of the locked region (lock against read
and write).
LK_NBLCK 2
Locks the specified region. If any part of the
region is already locked by a different process,
return the error EACCES instead of waiting for the
region to become available for locking (nonblock-
ing lockrequest).
Last change: XENIX Compatibility Package 1
locking(2) SYSTEM CALLS locking(2)
LK_RLCK 3 Same as LK_LOCK except that the locked region may
be read by other processes (read permitted lock).
LK_NBRLCK 4
Same as LK_NBLCK except that the locked region may
be read by other processes (nonblocking, read per-
mitted lock). The locking utility uses the
current file pointer position as the starting
point for the locking of the file segment. So a
typical sequence of commands to lock a specific
range within a file might be as follows:
fd=open("datafile",O_RDWR);
lseek(fd, 200L, 0);
locking(fd, LK_LOCK, 200L);
Accordingly, to lock or unlock an entire file a seek to the
beginning of the file (position 0) must be done and then a
locking call must be executed with a size of 0. size is the
number of contiguous bytes to be locked for unlocked. The
region to be locked starts at the current offset in the
file. If size is 0, the entire file is locked or unlocked.
size may extend beyond the end of the file, in which case
only the process issuing the lock call may access or add
information to the file within the boundary defined by size.
The potential for a deadlock occurs when a process control-
ling a locked area is put to sleep by accessing another pro-
cess' locked area. Thus calls to locking, read, or write
scan for a deadlock prior to sleeping on a locked region.
An EDEADLK error return is made if sleeping on the locked
region would cause a deadlock. Lock requests may, in whole
or part, contain or be contained by a previously locked
region for the same process. When this occurs, or when
adjacent regions are locked, the regions are combined into a
single area if the mode of the lock is the same (i.e.;
either read permitted or regular lock). If the mode of the
overlapping locks differ, the locked areas will be assigned
assuming that the most recent request must be satisfied.
Thus if a read only lock is applied to a region, or part of
a region, that had been previously locked by the same pro-
cess against both reading and writing, the area of the file
specified by the new lock will be locked for read only,
while the remaining region, if any, will remain locked
against reading and writing. There is no arbitrary limit to
the number of regions which may be locked in a file. Unlock
requests may, in whole or part, release one or more locked
regions controlled by the process. When regions are not
fully released, the remaining areas are still locked by the
process. Release of the center section of a locked area
requires an additional locked element to hold the separated
section. If the lock table is full, an error is returned,
and the requested region is not released. Only the process
which locked the file region may unlock it. An unlock
request for a region that the process does not have locked,
Last change: XENIX Compatibility Package 2
locking(2) SYSTEM CALLS locking(2)
or that is already unlocked, has no effect. When a process
terminates, all locked regions controlled by that process
are unlocked. If a process has done more than one open on a
file, all locks put on the file by that process will be
released on the first close of the file. Although no error
is returned if locks are applied to special files or pipes,
read/write operations on these types of files will ignore
the locks. Locks may not be applied to a directory.
SEE ALSO
close(2) creat(2), dup(2), lseek(2), open(2), read(2),
write(2)
DIAGNOSTICS
locking returns the value (int)-1 if an error occurs. If
any portion of the region has been locked by another process
for the LK_LOCK and LK_RLCK actions and the lock request is
to test only, errno is set to EAGAIN. If locking the region
would cause a deadlock, errno is set to EDEADLK If an inter-
nal lock cannot be allocated, errno is set to ENOLCK.
Last change: XENIX Compatibility Package 3