STDOUT
.
lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n pipemultread.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use IO::Handle; 4 5 my $np = (shift || 2); 6 my $last = $np-1; 7 my $i; 8 9 pipe(my $READER, my $WRITER) or die "Can't open pipe: $!\n"; 10 11 create_child($_, \&task, "you", "are", $_) for (0..$last); 12 close($READER); 13 $WRITER->autoflush(); 14 for $i (1..2*$np) { 15 print $WRITER "Message number $i From Father to Child\n"; 16 } 17 for $i (1..$np) { 18 print $WRITER "finish\n"; 19 wait(); 20 } 21 22 sub create_child { 23 my $id = shift; 24 my $task = shift; 25 my @args = @_; 26 27 my $pid; 28 29 return $pid if $pid = fork(); 30 die "Cannot fork $!" unless defined $pid; 31 close($WRITER); 32 my $result = task->($id, @args); # do something 33 exit; 34 } 35 36 sub task { 37 my $id = shift; 38 my @args = @_; 39 40 print "$id: Father pass me: @args\n"; 41 { 42 my $message = <$READER>; 43 print "$id: Received $message"; 44 last if ($message eq "finish\n"); 45 redo; 46 } 47 }
Se muestra el resultado de dos ejecuciones. Los hijos reciben los mensajes completos. Parece ser no determinístico quién lee desde el canal.
hp@nereida:~/Lperl/src/perl_networking/ch2$ perl pipemultread.pl 0: Father pass me: you are 0 1: Father pass me: you are 1 1: Received Message number 1 From Father to Child 1: Received Message number 2 From Father to Child 1: Received Message number 3 From Father to Child 1: Received Message number 4 From Father to Child 1: Received finish 0: Received finish lhp@nereida:~/Lperl/src/perl_networking/ch2$ perl pipemultread.pl 0: Father pass me: you are 0 1: Father pass me: you are 1 1: Received Message number 1 From Father to Child 0: Received Message number 2 From Father to Child 0: Received Message number 3 From Father to Child 0: Received Message number 4 From Father to Child 0: Received finish 1: Received finish
close(READER)
de la línea
12 a la línea 10?Casiano Rodríguez León