Price, Jason wrote:
> Not sure if this is the right list for this - if it's not, please
> direct me to the proper list.

You've come to the right place.

> 
> Anyway, I'm trying to get my hands around forking, and was hoping you
> all could help me out.  Basically, I'm trying to find a way to fire
> off a remote script on numerous boxes in parallel, returning their
> results to the parent script.  Here's the basic flow I'm after:
> 
> 1.  User brings up web page for an on-demand report.  Provides user
> input, hits submit, which fires off the parent script.
> 2.  Parent script takes user input, and fires off a remote script
> located on all servers provided by user input.
> 3.  Remote scripts return results to an array in the parent script.
> 4.  Parent script compiles results and formats output for web display.
> 
> The process currently works, but runs each remote server in series,
> which takes a considerable amount of time.  I've had a hell of a time
> finding a good explanation of forking, and I only seem to be able to
> figure out how to fork one process at a time.  I'm also unsure if the
> parent can utilize variables populated in a child, or if they're
> completely independent after the fork.

No. The parent cannot see any variables in the child. You need to use some
form of IPC to communicate between the processes. I would suggest using a
pipe. Here's an example of a parent that forks off three children, and then
reads data back from the children through a common pipe:

  #!/usr/bin/perl

  use strict;
  $| = 1;
  my $nc = 3;             # number of children to create
  pipe READER, WRITER;    # pipe for communication

  for my $c (1 .. $nc) {
      # create a child process
      defined(my $pid = fork) or die "Couldn't fork: $!";
      next if $pid;   # parent loops to create next child

      # child does it's thing and writes back to parent through pipe
      close READER;
      select WRITER;
      $| = 1;
      print "Hello, I am child $c, and my PID is $$\n";
      sleep rand(5) + 1;
      print "Goodbye from child $c\n";
      exit;           # child exits (IMPORTANT!)
  }

  # parent reads from children
  # pipe will close when last child exits
  close WRITER;
  while(<READER>) {
      print $_;
  }

  1 while wait() > 0;   # reap all exit statuses

Sample output:

  $ perl myscript.pl
  Hello, I am child 1, and my PID is 16774
  Hello, I am child 2, and my PID is 16775
  Hello, I am child 3, and my PID is 16776
  Goodbye from child 2
  Goodbye from child 1
  Goodbye from child 3

If you need explanation of any of that, let me know.

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to