use strict;
use warnings;
use Fcntl qw( :flock );
sleep(1);
open(my $fh, '+<', $0) or die "open: $!\n";
print localtime().": $$'s flock attempt starts\n";
flock($fh, LOCK_EX) or die "flock: $!\n";
print localtime().": $$'s flock obtained\n";
sleep(5);
print localtime().": $$ ends\n";
####
$ for q in 1 2 3 4 ; do perl 807067.pl & done
Fri Nov 13 17:21:04 2009: 20079's flock attempt starts
Fri Nov 13 17:21:04 2009: 20079's flock obtained
Fri Nov 13 17:21:04 2009: 20080's flock attempt starts
Fri Nov 13 17:21:04 2009: 20082's flock attempt starts
Fri Nov 13 17:21:04 2009: 20081's flock attempt starts
Fri Nov 13 17:21:09 2009: 20079 ends
Fri Nov 13 17:21:09 2009: 20081's flock obtained
Fri Nov 13 17:21:14 2009: 20081 ends
Fri Nov 13 17:21:14 2009: 20082's flock obtained
Fri Nov 13 17:21:19 2009: 20082 ends
Fri Nov 13 17:21:19 2009: 20080's flock obtained
Fri Nov 13 17:21:24 2009: 20080 ends
####
Fri Nov 13 17:26:42 2009: 20116's flock attempt starts
Fri Nov 13 17:26:42 2009: 20116's flock obtained
Fri Nov 13 17:26:42 2009: 20117's flock attempt starts
flock: Resource temporarily unavailable
Fri Nov 13 17:26:42 2009: 20118's flock attempt starts
flock: Resource temporarily unavailable
Fri Nov 13 17:26:42 2009: 20119's flock attempt starts
flock: Resource temporarily unavailable
####
use Errno qw( EWOULDBLOCK );
if (flock(..., ... | LOCK_NB)) {
lock obtained
}
elsif ($! == EWOULDBLOCK) {
lock denied
}
else {
some error
}