Puesto que los mensajes de envío se guardan en un buffer es posible hacer los dos envíos simultáneamente sin producir el atasco, siempre que los mensajes sean lo suficientemente pequeños como para caber en los buffers. Una vez superado ese tamaño se producirá el temido atasco (deadlock). Observe la siguiente variante del ejemplo anterior en el que los dos procesos envían y despues reciben:
lhp@nereida:~/Lperl/src/cookbook/ch16$ cat -n mypipebothsend.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use IO::Handle; 4 5 my $amount = shift || 1; 6 my $dummy_message = "Hello from "x$amount; 7 my ($FROM_CHILD, $TO_FATHER); 8 my ($FROM_FATHER, $TO_CHILD); 9 pipe($FROM_CHILD, $TO_FATHER); 10 pipe($FROM_FATHER, $TO_CHILD); 11 $TO_FATHER->autoflush(1); 12 $TO_CHILD->autoflush(1); 13 14 my $pid; 15 16 if ($pid = fork) { 17 die "cannot fork: $!" unless defined $pid; 18 close $FROM_FATHER; close $TO_FATHER; 19 print $TO_CHILD "$dummy_message Father (PID $$)!\n"; 20 my $line; 21 chomp($line = <$FROM_CHILD>); 22 print "Father (PID $$) received: <$line>\n"; 23 close $FROM_CHILD; close $TO_CHILD; 24 waitpid($pid,0); 25 } else { 26 close $FROM_CHILD; close $TO_CHILD; 27 print $TO_FATHER "$dummy_message Child (PID $$)!\n"; 28 my $line; 29 chomp($line = <$FROM_FATHER>); 30 print "Child (PID $$) received: <$line>\n"; 31 close $FROM_FATHER; close $TO_FATHER; 32 exit; 33 }Cuando se ejecuta con tamaños pequeños, el programa funciona:
hp@nereida:~/Lperl/src/cookbook/ch16$ mypipebothsend.pl Father (PID 10383) received: <Hello from Child (PID 10384)!> Child (PID 10384) received: <Hello from Father (PID 10383)!> lhp@nereida:~/Lperl/src/cookbook/ch16$ mypipebothsend.pl 2 Child (PID 10386) received: <Hello from Hello from Father (PID 10385)!> Father (PID 10385) received: <Hello from Hello from Child (PID 10386)!> lhp@nereida:~/Lperl/src/cookbook/ch16$ mypipebothsend.pl 6000 .... # never ends ...
$amount
se atasca el programa
anterior en su sistema. Modifique el programa para calcular
de cuantos caractéres se trata.Casiano Rodríguez León