in reply to forking and ipc

i'm not a real wizard, but i managed to scrape this together. it seems to do the generic task of running pieces of data (isos) through resources (burners) and waiting for a resource to finish before continuing.

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
    i just realized upon reviewing your description that you want to run a round of burns, then reload all drives at the same time, then do another round, etc. to achieve this, replace the main loop with this:
    my $chld; while (@data) { while (@resource) { last unless @data; my $resource = shift @resource; my $data = shift @data; if (($chld = fork()) > 0) { # parent code $jobs{$chld} = $resource; } else { # child code runcmd($resource, $data); exit; # end chld, trigger $SIG{CHLD} } } sleep until @resource == $num_resources; print "ONE ROUND DONE"; last unless @data; print "RELOAD THEN PRESS ENTER: "; <>; }

    perl -e'$_="nwdd\x7F^n\x7Flm{{llql0}qs\x14";s/./chr(ord$&^30)/ge;print'