in reply to Forked up

Here are some links to nodes where I have posted some fork examples of increasing complexity including some IPC stuff. The last one is probably the sort of thing you are looking for.
Forked off!
Help with waitpid and forking ?
Parallel::ForkManager vs global variables

cheers

tachyon

s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

Replies are listed 'Best First'.
Re: Re: Forked up
by smackdab (Pilgrim) on Oct 09, 2001 at 07:33 UTC
    Thanks, I tried the examples and they exhibit the same problem...just add:

    $buf=`ping 127.0.0.1`;

    to the "#this is child" block...

    I don't know stdout/stdin...but wonder about it...

    thanks!

      Windows was not designed with forking in mind. I get the same problem using backticks - they work fine in the parent but hang in the child. Probably relates to the fork() implementation/emulation on Windows. Solution - don't use backtics in child. This works fine using the Net::Ping module.

      use Net::Ping; pipe (FROM_CHILD, TO_PARENT) or die "Oops Pipe: $!\n"; pipe (FROM_PARENT, TO_CHILD) or die "Oops Pipe: $!\n"; select((select(TO_CHILD), $|++ )[0]); # set autoflush select((select(TO_PARENT), $|++ )[0]); # set autoflush $|++; my $result; # let's fork if ( my $pid = fork ) { # this is parent print "Sending to kid\n"; sleep 1; print TO_CHILD "perlmonks.org\n"; chomp( my $child_says = <FROM_CHILD> ); print "Child says '$child_says' to parent\n"; $result = $child_says; waitpid( $pid, 0 ); } else { # this is child die "Can't fork: $!\n" unless defined $pid; print "Waiting to get info from parent\n"; chomp( my $parent_says = <FROM_PARENT> ); print "Parent says '$parent_says' to child\n"; my $p = Net::Ping->new(); my $ping = $p->ping($parent_says); print "Net::Ping in child returned: $ping\n"; $p->close(); print TO_PARENT "Child pid $$ replies:$ping\n"; exit; } close FROM_CHILD; close TO_CHILD; close FROM_PARENT; close TO_PARENT; print "Parent got $result\n";

      cheers

      tachyon

      s&&rsenoyhcatreve&&&s&n.+t&"$'$`$\"$\&"&ee&&y&srve&&d&&print

        Thanks tachyon !!! I also booted into Linux and it exhibited the same problem as Win32...I need to execute multiple commands, not just "ping", which was an example... I guess, I can try writing the data to a temp file and then waiting a few secs to read it...If I find out how to get the pipe working, I'll post it.