[Detroit-pm] Trying to stick a fork in it!

Mike Ward unforgiven24 at gmail.com
Sat Mar 29 13:19:59 PDT 2008


I've never actually done any forking in Perl and was curious, so thanks for
posting the code. I wouldn't mind looking at the two-directional code as
well, if it's no trouble.

- Mike

On Fri, Mar 28, 2008 at 5:20 PM, Scott Webster Wood <treii28 at yahoo.com>
wrote:

> OK, I briefly tried threading with some success until I found out the
> final tool was going to be on a machine running a pre-5.8 version of perl
> so I went back to pipes and sockets and here's what I came up with in case
> anyone is curious.
>
> I stripped out the bidirectional communication as I'm only talking
> from-child-to-parent but if anyone wants to see the two-directional code,
> just let me know (basically just imagine adding the code after the variable
> initialization from 'sub parent' to 'sub child' and vice versa and changing
> the verbage)
>
>
> --------------------------- cut here -----------------------------
> #!/usr/bin/perl
>
> use Socket;
> use IO::Handle;
>
> my (@c, at p, at pid); # c=child handle, p=parent handle, pid=process ID
> for(my $s=0; $s<5; $s++) {
>  $c[$s] = new IO::Handle;
>  $p[$s] = new IO::Handle;
>
>  socketpair($c[$s], $p[$s], AF_UNIX, SOCK_STREAM, PF_UNSPEC)
>    or  die "socketpair: $!";
>
>  $c[$s]->autoflush(1);
>  $p[$s]->autoflush(1);
>
>
>  if ($pid[$s] = fork()) { # is the parent
>    close $p[$s];        # close unused parent stream
>    &parent($c[$s], $s);
>    close $c[$s];        # close the stream coming back from the child
>    waitpid($pid[$s],0); # wait for child process to terminate
>  } else {                   # is the child
>    die "cannot fork: $!" unless defined $pid[$s];          # make sure pid
> == 0
>    close $c[$s];        # close the unused child stream
>    &child($p[$s], $s);
>    close $p[$s];        # close stream that was talking to the parent
>    exit(0);
>  }
> }
>
> sub parent() { # read data coming from child process(es)
>  my $fh = shift;
>  my $s  = shift;
>  while ($line = <$fh>) { # read data from child line by line until done
>    chomp($line);
>    print "Parent $s Pid $$ just read this: `$line'\n";
>  };
> }
>
> sub child() { # send data back to parent through filehandle
>  my $fh = shift;
>  print $fh "Child Pid $$ is sending this\n";
>  print $fh "Child Pid $$ sends some more\n";
> }
>
> # filehandles didn't behave well using array references and my ultimate
> solution
> #  is going to create functions to perform tasks anyway so I just passed
> the
> #  handles to subroutines
>
> -------------- cut ------------
> $ ./test.pl
> Parent 0 Pid 25960 just read this: `Child Pid 25961 is sending this'
> Parent 0 Pid 25960 just read this: `Child Pid 25961 sends some more'
> Parent 1 Pid 25960 just read this: `Child Pid 25962 is sending this'
> Parent 1 Pid 25960 just read this: `Child Pid 25962 sends some more'
> Parent 2 Pid 25960 just read this: `Child Pid 25963 is sending this'
> Parent 2 Pid 25960 just read this: `Child Pid 25963 sends some more'
> Parent 3 Pid 25960 just read this: `Child Pid 25964 is sending this'
> Parent 3 Pid 25960 just read this: `Child Pid 25964 sends some more'
> Parent 4 Pid 25960 just read this: `Child Pid 25965 is sending this'
> Parent 4 Pid 25960 just read this: `Child Pid 25965 sends some more'
>
>
>
>
>
>  ____________________________________________________________________________________
> Be a better friend, newshound, and
> know-it-all with Yahoo! Mobile.  Try it now.
> http://mobile.yahoo.com/;_ylt=Ahu06i62sR8HDtDypao8Wcj9tAcJ
> _______________________________________________
> Detroit-pm mailing list
> Detroit-pm at pm.org
> http://mail.pm.org/mailman/listinfo/detroit-pm
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.pm.org/pipermail/detroit-pm/attachments/20080329/6dcdfb5a/attachment.html 


More information about the Detroit-pm mailing list