Problems with lockf/fcntl style file locking

angst at batserver.cs.uq.oz.au angst at batserver.cs.uq.oz.au
Fri Sep 21 10:03:00 AEST 1990


I need to lock an entire NFS file for exclusive access (under SunOS 4.1).

I tried using lockf, intending that the process should sleep until the
file was free if it was already locked.  It would gain a lock okay, but
when it came to releasing that lock if there was a lock request pending,
both processes would hang and eventually enter uninterruptable waits.

So I thought I'd give fcntl a go.  To start with I used F_SETLKW (1) for
both the lock request and the lock release.  This behaved in the same way
as the lockf (not suprising really, as I expect lockf is implemented in
terms of fcntl).  Then I tried using F_SETLK (not F_SETLKW) for releasing
the lock and it worked -- or so it seemed.

Just to be thorough I had two processes on different clients requesting
locks for a file that was on a different server to either client.  I ran
one process from my console client; the other from an rlogin to another
client.  The process that gained the first lock would unlock and exit with
no problem; the other just slept indefinitely.  This was the behaviour no
matter which of the two gained the first lock.

Can anyone out there explain this ?  I don't usually read comp.sys.sun, so
i apologise if I've just missed the largest ever discussion on how to lock
NFS files in SunOS 4.1.

Angst

(1) F_SETLKW and F_SETLK are the commands passed to fcntl to gain a lock as
    specified in the lock structure.  F_SETLKW will wait if there is another
    process that has exclusive access; F_SETLK returns immediately with an
    error.



More information about the Comp.sys.sun mailing list