in reply to simple IPC

It's not exactly simple, but here's how to do it the old-fashioned way with pipe, sysread, and syswrite. Note how the pipe protocol uses the number of bytes transferred in every message to detect its length:
use strict; my @array = (); pipe my $read, my $write or die "Cannot open pipe"; for(1..3) { defined(my $pid = fork) or die "Can't fork\n"; if($pid) { next; # Parent: continue loop } # Child pipe_send($write, "I'm process $$!"); exit 0; } # Parent for(1..3) { my $element = pipe_recv($read); push @array, $element; } print "array = @array\n"; ################################################## sub pipe_send { ################################################## my($fh, $message) = @_; my $bytes = sprintf "0x%08x", length($message); syswrite($fh, $bytes . $message); } ################################################## sub pipe_recv { ################################################## my($fh) = @_; die "Protocol corrupted" if sysread($fh, my $bytes, 10) != 10; $bytes = hex($bytes); my $data = ""; while($bytes != 0) { my $read = sysread($fh, my $chunk, $bytes); last unless defined $read; $bytes -= $read; $data .= $chunk; } return $data; }

Replies are listed 'Best First'.
Re^2: simple IPC
by keithw99 (Initiate) on Dec 27, 2004 at 02:43 UTC
    Thank you so much everyone. I got it working now. I needed to figure this out because I'm working on a large complex script that polls the MAC-address table (CAM) of several switches on a large network, then consolidates the results into a database. Knowing how to make the polling processes run simultaneously (using the example above), my code will be much more efficient now instead of polling the switches one at a time. Thanks again, you all rock!