use strict; use Fcntl qw(F_SETLK F_WRLCK SEEK_SET); BEGIN { # c2ph says: typedef='s2 l2 i', sizeof=16 my $FLOCK_STRUCT = 's s l l i'; sub linux_flock { if (wantarray) { my ($type, $whence, $start, $len, $pid) = unpack($FLOCK_STRUCT, $_[0]); return ($type, $whence, $start, $len, $pid); } else { my ($type, $whence, $start, $len, $pid) = @_; return pack($FLOCK_STRUCT, $type, $whence, $start, $len, $pid); } } } if (fork != 0) { # parent open(BLA, ">/tmp/bla") or die $!; chmod 02644, "/tmp/bla" or die $!; warn "lock ..."; fcntl(*BLA, F_SETLK, linux_flock(F_WRLCK, SEEK_SET, 0, 0, 0)) or die $!; warn "lock done..."; } else { sleep 1; warn "try to open in other process"; open(BLA, ">/tmp/bla") or die $!; warn "open was successful"; }