#!/usr/bin/perl -w use strict; use Fcntl qw(:DEFAULT :seek); use 5.10.0; our @extraoptions = (); my %fh; my $str = "#push \@extraoptions, '--bvtonly';\npush \@extraoptions, '--debug';warn 'included by eval'"; 1 && eval($str); print "eval error - '$@'\n"; doit(); exit; sub doit { my $file = '/tmp/z'; say "lock says: ".(lockf($file) // "UNDEFINED - $!"); say "unlock says: ".(unlockf($file) // "UNDEFINED - $!"); } sub lockf { my $version = shift; open $fh{$version}, ">>$version" or die; my $flags = pack('sslli', F_WRLCK, SEEK_SET, 0, 0);# struct flock from fcntl - flock doesn't work on NFS return fcntl($fh{$version}, F_SETLK, $flags); } sub unlockf { my $version = shift; if($fh{$version}){ my $flags = pack('sslli', F_UNLCK, SEEK_SET, 0, 0);# struct flock from fcntl - flock doesn't work on NFS my $ret= fcntl($fh{$version}, F_SETLK, $flags); delete $fh{$version}; return $ret; }else{ die "Cannot release lock I don't hold for $version!"; } }