#!/usr/bin/perl
######################################################################
# (c) Michael Schilli 1999
######################################################################

use Fcntl qw/:flock/;              # Lock-Parameter
                                   # vordefinieren
open(FILE, ">lockfile");

foreach $number (1..3) {

    if(!defined ($pid = fork())) { # Fork Fehler
        die "fork error";
    } elsif($pid == 0) {           # Child
        critical($number);         # Sektion ausführen
        exit 0;                    # Child beenden
    } else {
                                   # Parent
    }
}

close(FILE);                       # Parent schließt Lock-Datei

while(wait() > 0) { ; }            # Terminierung der
                                   # Child-Prozesse abwarten

sub critical {                    
    my $number = shift;

    flock(FILE, LOCK_EX);          # Exklusiven Lock setzen

    print "$number betritt kritische Sektion\n";
    sleep(1);
    print "$number verläßt kritische Sektion\n";

    flock(FILE, LOCK_UN);          # Lock zurücknehmen
}
