Comunicación Bidireccional con Pipe

Es posible establecer una comunicación bidireccional usando dos pipes en sentidos opuestos.

lhp@nereida:~/Lperl/src/cookbook/ch16$ cat -n mypipe.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  use IO::Handle;
 4
 5  my ($FROM_CHILD, $TO_FATHER) = (IO::Handle->new(), IO::Handle->new());
 6  my ($FROM_FATHER,  $TO_CHILD) = (IO::Handle->new(), IO::Handle->new());
 7  pipe($FROM_CHILD, $TO_FATHER);
 8  pipe($FROM_FATHER,  $TO_CHILD);
 9  $TO_FATHER->autoflush(1);
10  $TO_CHILD->autoflush(1);
11
12  my $pid;
13
14  if ($pid = fork) {
15      die "cannot fork: $!" unless defined $pid;
16      close $FROM_FATHER; close $TO_FATHER;
17      my $line;
18      chomp($line = <$FROM_CHILD>);
19      print "Father (PID $$) received: <$line>\n";
20      print $TO_CHILD "Hello from Father (PID $$)!\n";
21      close $FROM_CHILD; close $TO_CHILD;
22      waitpid($pid,0);
23  } else {
24      close $FROM_CHILD; close $TO_CHILD;
25      print $TO_FATHER "Hello from Child (PID $$)!\n";
26      my $line;
27      chomp($line = <$FROM_FATHER>);
28      print "Child (PID $$) received: <$line>\n";
29      close $FROM_FATHER; close $TO_FATHER;
30      exit;
31  }
Observe que para evitar la presencia de atascos el proceso hijo emprende el envío primero (línea 25) y la recepción después (línea 27) mientras que el padre lo hace a la inversa: recibe primero (línea 18) y envía a continuación (línea 20). La ejecución produce la salida:
lhp@nereida:~/Lperl/src/cookbook/ch16$ ./mypipe.pl
Father (PID 5032) received: <Hello from Child (PID 5033)!>
Child (PID 5033) received: <Hello from Father (PID 5032)!>

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