1#!perl -w 2# Test O_EXLOCK 3 4use Test::More; 5use strict; 6use Fcntl; 7 8BEGIN { 9# see if we have O_EXLOCK 10 eval { &Fcntl::O_EXLOCK; }; 11 if ($@) { 12 plan skip_all => 'Do not seem to have O_EXLOCK'; 13 } else { 14 plan tests => 4; 15 use_ok( "File::Temp" ); 16 } 17} 18 19# Need Symbol package for lexical filehandle on older perls 20require Symbol if $] < 5.006; 21 22# Get a tempfile with O_EXLOCK 23my $fh = new File::Temp(); 24ok( -e "$fh", "temp file is present" ); 25 26# try to open it with a lock 27my $flags = O_CREAT | O_RDWR | O_EXLOCK; 28 29my $timeout = 5; 30my $status; 31eval { 32 local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required 33 alarm $timeout; 34 my $newfh; 35 $newfh = &Symbol::gensym if $] < 5.006; 36 $status = sysopen($newfh, "$fh", $flags, 0600); 37 alarm 0; 38}; 39if ($@) { 40 die unless $@ eq "alarm\n"; # propagate unexpected errors 41 # timed out 42} 43ok( !$status, "File $fh is locked" ); 44 45# Now get a tempfile with locking disabled 46$fh = new File::Temp( EXLOCK => 0 ); 47 48eval { 49 local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required 50 alarm $timeout; 51 my $newfh; 52 $newfh = &Symbol::gensym if $] < 5.006; 53 $status = sysopen($newfh, "$fh", $flags, 0600); 54 alarm 0; 55}; 56if ($@) { 57 die unless $@ eq "alarm\n"; # propagate unexpected errors 58 # timed out 59} 60ok( $status, "File $fh is not locked"); 61