in reply to forking and ipc
hope this helps.
#!perl -l use strict; use warnings; # make WNOHANG available use POSIX ":sys_wait_h"; our %jobs; # track pid -> resource our @resource = qw{a b c}; # concurrent resources my @data = qw{5 4 3 2 1 0}; # data to run through a resource $SIG{"CHLD"} = sub { my $chld; $chld = waitpid(-1, WNOHANG) until $chld; return unless $chld > 0; print "$$ sees $chld is done"; print "resource " . $jobs{$chld} . " is free again!"; push @resource, $jobs{$chld}; delete $jobs{$chld}; alarm 0; # send SIGALRM so sleep() wakes up }; sub runcmd { my ($resource, $data) = @_; my @cmd = ("sleep", $data); # define command print ">>> $$ runcmd($resource, $data) start"; system @cmd; # run command print "<<< $$ runcmd($resource, $data) end"; } print "main pid: $$"; while (@data) { my ($data, $resource, $chld) = shift @data; print "sleep ... resource(@resource), data(@data)"; sleep until @resource; print "done sleeping! resource(@resource), data(@data)"; $resource = shift @resource; if (($chld = fork()) > 0) { # parent code $jobs{$chld} = $resource; } else { # child code runcmd($resource, $data); exit; # end chld, trigger $SIG{CHLD} } } sleep until keys %jobs == 0; # wait for all jobs print "all done!";
perl -e'$_="nwdd\x7F^n\x7Flm{{llql0}qs\x14";s/./chr(ord$&^30)/ge;print'
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Re: forking and ipc
by pizza_milkshake (Monk) on May 03, 2004 at 05:15 UTC |