#!/usr/bin/perl
######################################################################
# raceflock.pl
######################################################################
# Perl Power! - Michael Schilli 1998
######################################################################

use Fcntl qw/:flock/;              # predefine lock parameters

open(FILE, ">lockfile");

foreach $number (1..3) {

    if(!defined ($pid = fork())) { # fork error
        die "fork error";
    } elsif($pid == 0) {           # child
        critical($number);         # execute section
        exit 0;                    # terminate child
    } else {
                                   # parent
    }
}

close(FILE);                       # parent closes lock file

while(wait() > 0) { ; }            # wait for termination
                                   # of the child processes

sub critical {                    
    my $number = shift;

    flock(FILE, LOCK_EX);          # set exclusive lock

    print "$number enters critical section\n";
    sleep(1);
    print "$number leaves critical section\n";

    flock(FILE, LOCK_UN);          # release lock
}

