\" $NetBSD: pidlock.3,v 1.13 2017/10/23 01:05:10 wiz Exp $
\"
\" Copyright 1996, 1997 by Curt Sampson <
[email protected]>
\"
\" 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.
\"
\" THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. 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 FOUNDATION 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.
\"
Dd March 19, 2006
Dt PIDLOCK 3
Os
Sh NAME
Nm pidlock ,
Nm ttylock ,
Nm ttyunlock
Nd locks based on files containing PIDs
Sh LIBRARY
Lb libutil
Sh SYNOPSIS
In util.h
Ft int
Fn pidlock "const char *lockfile" "int flags" "pid_t *locker" "const char *info"
Ft int
Fn ttylock "const char *tty" "int flags" "pid_t *locker"
Ft int
Fn ttyunlock "const char *tty"
Sh DESCRIPTION
The
Fn pidlock
Fn ttylock ,
and
Fn ttyunlock
functions attempt to create a lockfile for an arbitrary resource that
only one program may hold at a time.
(In the case of
Fn ttylock ,
this is access to a tty device.)
If the
function succeeds in creating the lockfile, it will succeed for
no other program calling it with the same lockfile until the original
calling program has removed the lockfile or exited.
The
Fn ttyunlock
function will remove the lockfile created by
Fn ttylock .
Pp
These functions use the method of creating a lockfile traditionally
used by UUCP software.
This is described as follows in the documentation for Taylor UUCP:
Bd -filled -offset indent
The lock file normally contains the process ID of the locking process.
This makes it easy to determine whether a lock is still valid.
The algorithm is to create a temporary file and then link
it to the name that must be locked.
If the link fails because a file with that name already exists,
the existing file is read to get the process ID.
If the process still exists, the lock attempt fails.
Otherwise the lock file is deleted and the locking algorithm
is retried.
Ed
Pp
The PID is stored in ASCII format, with leading spaces to pad it
out to ten characters, and a terminating newline.
This implementation has been extended to put the hostname
on the second line of the file, terminated with a newline, and
optionally an arbitrary comment on the third line of the file, also
terminated with a newline.
If a comment is given, but
Dv PIDLOCK_NONBLOCK
is not, a blank line will be written as the second line of the file.
Pp
The
Fn pidlock
function will attempt to create the file
Fa lockfile
and put the current process's pid in it.
The
Fn ttylock
function will do the same, but should be passed only the base name
(with no leading directory prefix) of the
Fa tty
to be locked; it will test that the tty exists in
Pa /dev
and is a character device, and then create
the file in the
Pa /var/spool/lock
directory and prefix the filename with
Pa LCK.. .
Use the
Fn ttyunlock
function to remove this lock.
Pp
The following flags may be passed in
Pa flags :
Bl -tag -width Dv -offset indent
It Dv PIDLOCK_NONBLOCK
The function should return immediately when a lock is held by another
active process.
Otherwise the function will wait (forever, if necessary)
for the lock to be freed.
It Dv PIDLOCK_USEHOSTNAME
The hostname should be compared against the hostname in the second
line of the file (if present), and if they differ, no attempt at
checking for a living process holding the lock will be made, and
the lockfile will never be deleted.
(The process is assumed to be alive.)
This is used for locking on NFS or other remote filesystems.
(The function will never create a lock if
Dv PIDLOCK_USEHOSTNAME
is specified and no hostname is present.)
El
Pp
If
Pa locker
is non-null, it will contain the PID of the locking process, if there
is one, on return.
Pp
If
Pa info
is non-null and the lock succeeds, the string it points to will be
written as the third line of the lock file.
Sh RETURN VALUES
Zero is returned if the operation was successful; on an error a -1
is returned and a standard error code is left in the global location
Va errno .
Sh ERRORS
In addition to the errors that are returned from
Xr stat 2 ,
Xr open 2 ,
Xr read 2 ,
Xr write 2 ,
and
Xr link 2 ,
Fn pidlock
or
Fn ttylock
can set
Va errno
to the following values on failure:
Bl -tag -width Er
It Bq Er EFTYPE
The
Fa tty
specified in
Fn ttylock
is not a character special device.
It Bq Er EWOULDBLOCK
Another running process has a lock and the
Dv PIDLOCK_NONBLOCK
flag was specified.
El
\" .Sh SEE ALSO
Sh HISTORY
The
Fn pidlock
and
Fn ttylock
functions appeared in
Nx 1.3 .
Sh AUTHORS
An Curt Sampson
Aq
[email protected] .
Sh BUGS
The lockfile format breaks if a pid is longer than ten digits when
printed in decimal form.
Pp
The PID returned will be the pid of the locker on the remote machine if
Dv PIDLOCK_USEHOSTNAME
is specified, but there is no indication that this is not on the local
machine.