Atascos

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 ...

Ejercicio 4.1.2   Encuentre para que valor de $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
Licencia de Creative Commons
Programación Distribuida y Mejora del Rendimiento
por Casiano Rodríguez León is licensed under a Creative Commons Reconocimiento 3.0 Unported License.

Permissions beyond the scope of this license may be available at http://campusvirtual.ull.es/ocw/course/view.php?id=44.
2012-06-19