#!/usr/bin/perl ## Init the detached codes: sub DETACH_INIT { my ( $x ) = @_ ; $| = 1 ; ## Flush STDOUT or will lock some threads on Win32. $SIG{CHLD} = \&REAPER ; ## Who will lead with childs on real fork. ## Run $x times the detached codes: my $wpid = 0 ; for my $i (1..$x) { next if $wpid ; ## Next until the wait() is on. &SPAWN($i) ; } ## Wait for the childs. sub REAPER{ $wpid = wait ; $SIG{CHLD} = \&REAPER ; } ## Make the fork, start the detached code, than continue main code. ## When the detached code return, make an exit of the forked process or thread. sub SPAWN { my ( $id ) = @_ ; my $pid ; if (!defined($pid = fork)) { print "cannot fork: $!\n" ; return ;} elsif ($pid) { return ;} exit &DETACHED_CODE($id) ; } } ## Code to be runned detached: sub DETACHED_CODE { my ( $id ) = @_ ; for(0..10) { print "$id>> $_\n" ; sleep(1); } } ## Tell to start 2 detached codes: &DETACH_INIT(2) ; ## Some main code to continue: for(0..10) { print "main>> $_\n" ; sleep(1); }