$SEMAPHORE = $tempfile . '.lck'; open(S, ">$SEMAPHORE") or die "$SEMAPHORE: $!"; flock(S, LOCK_EX) or die "flock() failed for $SEMAPHORE: $!"; open (TEMP, ">$tempfile") or die "Can't open $tempfile: $!"; open (FH, "$file") or die "Can't open $file: $!"; while () { ## do_something; } close FH; close TEMP; rename($tempfile,$file); close S;