#!/usr/bin/perl -w use strict; use POSIX ":sys_wait_h"; $SIG{CHLD} = sub {wait}; sub logger { my $file = shift; my $handle; open($handle,">$file") || die "in pain: $file: $!"; select($handle); $| =1; select(STDOUT); return sub { my $prefix = shift; return sub { print $handle "$prefix ".shift()."\n" }; }; } # for demo purposes, just to get some overlap my $warn = logger("warnings"); my $error = logger("errors"); my @identity = qw(identity1 identity2 identity3 identity4); foreach my $i (1..4) { my $identity = shift(@identity); unless (my $pid = fork()) { my $wlog = &$warn("$identity: "); my $elog = &$error("$identity: "); # make things a little more tidy sub logwarn { &$wlog(shift); } sub logerror { &$elog(shift); } foreach my $t (1..3) { sleep 2; logwarn("random warning $t"); logerror("random error $t"); } exit(0); } sleep(2); } my $kid; do { $kid = waitpid(-1,&WNOHANG); } until $kid == -1;