use Fcntl qw( :flock ); { my $ini; open $ini, '+<', "$path/$fname" or die $!; flock $ini, LOCK_EX; my @lines = <$ini>; seek $ini, 0, 0; print $ini edit(@lines) or die $!; close $ini or die $!; } #### use Fcntl; { my {$in,$out); sysopen $out, "$path/$fname.bak", O_WRONLY | O_CREAT | O_EXCL | O_EXLOCK or sleep 1 and redo; open $in, '<', "$path/$fname" or die $!; flock $in, LOCK_EX; while (<$in>) { # edit operations to modify or skip $_ print $out or die $!; } close $in; close $out or die $! rename "$path/$fname.bak", "$path/$fname" or die $!; }