########################################## # Reading $Afile = "A.txt"; $SEMAPHORE = $Afile . '.lck'; open(S, ">$SEMAPHORE") or die "$SEMAPHORE: $!"; flock(S, LOCK_SH) or die "flock() failed for $SEMAPHORE: $!"; open (FH, "$Afile") or die "Can't open $Afile: $!"; while () { ## do_something; } close FH; close S; ##########################################- wrong way # Writing $Bfile = "B.txt"; $SEMAPHORE = $Bfile . '.lck'; ### Using $Bfile as $SEMAPHORE file name open(S, ">$SEMAPHORE") or die "$SEMAPHORE: $!"; flock(S, LOCK_EX) or die "flock() failed for $SEMAPHORE: $!"; open (TEMP, ">$Bfile") or die "Can't open $Bfile: $!"; open (FH, "$Afile") or die "Can't open $Afile: $!"; while () { ## do_something; } close FH; close TEMP; rename($Bfile,$Afile); close S; ########################################## -right way? # Writing $Bfile = "B.txt"; $SEMAPHORE = $Afile . '.lck'; ### Should be using $Afile as $SEMAPHORE file name etc..