[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