> I just thought of a clever way to do it without alarm!
So clever, it doesn't work! > lock_file($foo); > open(FH, $foo); > ok( !flock(FH, LOCK_NB | LOCK_EX) ); Seriously, on most unix systems, the following: flock(FH, LOCK_EX); flock(FH, LOCK_EX|LOCK_NB) or die; doe *not* die. A process is allowed to ask for (and obtain) an exclusive lock on a file if it already has a lock on that same file. There's no deadlock at all. I just checked this under linux and solaris with: use Fcntl ':flock'; open F, "+< $0: or die $!; flock F, LOCK_EX or die $!; flock F, LOCK_EX|LOCK_NB or die $!; print "OK\n"; and it OK's on both. Similarly, use Fcntl ':flock'; open F, "+< $0" or die $!; open G, "+< $0" or die $!; flock F, LOCK_EX or die $!; flock G, LOCK_EX|LOCK_NB or die $!; print "OK\n"; This failus under Linux (which I think is wrong) but OK's on Solaris. "OK" here means "What you suggested won't work." > The traditional approaches require causing a deadlock and breaking it > with alarm. Perhaps the traditional approach doesn't work. :) > So here's the other way. We cause a deadlock using another process > which kills itself after a certain amount of time. > > my $start = time; > lock_file($foo); > system($^X, '-e', 'use Whatever; alarm 5; lock_file($foo)'); > cmp_ok( time, '>', $start + 3, 'Locking works' ); > > again, these all rely on alarm(). This on also relies on system creating a new process. I wasn't sure what this would do on Win32, VMS, OS390, etc. Hence my original question: >> What is an easy way to check that the file is actually being locked? >> I put off writing the tests because i did not want to fork. Sorry to be so elliptical. What I should have said was that I can think of lots of ways to do it but they all involve starting a new process, and I'm reluctant to start a new prcoess unless I have to, because I have no idea what it does on Weird Platform X.