Part of the rational for modern relational database was to solve the problems caused by race conditions and data corruption when using flat file databases that are accessed by mutiple processes simultaneously. Using a database allows the database to handle these issues for you so you might do well to consider that option.

That said this code should (probably :-) work OK for you:

#!/usr/bin/perl -w use strict; use POSIX ":sys_wait_h"; use Fcntl ':flock'; $|++; # set a timeout in second waiting for an exclusive lock my $timeout = 10; # in main body of code open file for append # filehandle will be available to all your kids open FH, ">>$file" or die "Can't open $file: $!"; my $pid = fork() die "Can't fork $!\n" unless defined $pid; unless ($pid) { # in a kid, get an exclusive lock on file my $tries = 0; until (flock FH, LOCK_EX|LOCK_NB) { sleep 1; die "Can't get exclusive lock $!\n" if $tries++ > $timeout } seek FH, 0, 2; # make sure we are at EOF print FH $blah; # safe to print here flock FH, LOCK_UN; # release lock for other kids exit; # kill kid } # wait for all kids to finish my $kids; do{ $kids = waitpid(-1, &WNOHANG) }until $kids == -1; close FH; # close file in parent

Update

Added seek FH, 0, 2 as per suggestion by dws

cheers

tachyon

s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print


In reply to Re: (OT?) File Locking by tachyon
in thread (OT?) File Locking by Anonymous Monk

Title:
Use:  <p> text here (a paragraph) </p>
and:  <code> code here </code>
to format your post, it's "PerlMonks-approved HTML":



  • Posts are HTML formatted. Put <p> </p> tags around your paragraphs. Put <code> </code> tags around your code and data!
  • Titles consisting of a single word are discouraged, and in most cases are disallowed outright.
  • Read Where should I post X? if you're not absolutely sure you're posting in the right place.
  • Please read these before you post! —
  • Posts may use any of the Perl Monks Approved HTML tags:
    a, abbr, b, big, blockquote, br, caption, center, col, colgroup, dd, del, details, div, dl, dt, em, font, h1, h2, h3, h4, h5, h6, hr, i, ins, li, ol, p, pre, readmore, small, span, spoiler, strike, strong, sub, summary, sup, table, tbody, td, tfoot, th, thead, tr, tt, u, ul, wbr
  • You may need to use entities for some characters, as follows. (Exception: Within code tags, you can put the characters literally.)
            For:     Use:
    & &amp;
    < &lt;
    > &gt;
    [ &#91;
    ] &#93;
  • Link using PerlMonks shortcuts! What shortcuts can I use for linking?
  • See Writeup Formatting Tips and other pages linked from there for more info.