Ejemplo: Comunicación Bidireccional con bc

El siguiente ejemplo muestra una ejecución de la calculadora Unix bc en una máquina remota. El control de bc desde nuestro programa se ve dificultado porque no existe una relación una línea de pregunta-una linea de respuesta entre nuestra aplicación y bc. Por ejemplo, si el cliente escribe 4*8\n la calculadora responde con una nueva línea conteniendo 32\n. Sin embargo, si escribimos a = 4\n la calculadora bc toma nota del nuevo valor de a pero no muestra su contenido en pantalla.
lhp@nereida:~/Lperl/src/perl_networking/ch2$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
4*2        <-- usuario
8
a = 4      <-- usuario
a          <-- usuario
4
^D         <-- usuario
La solución heurística que seguimos en el siguiente programa es establecer un límite de tiempo de dos segundos de espera por la respuesta. Para ello usamos la estrategia introducida en la sección 3.4.9. Si no hay respuesta de bc se pasa al siguiente turno del programa.

lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n open2bc.pl
     1  #!/usr/bin/perl -w
     2  use strict;
     3  use IPC::Open2;
     4  use IO::Handle;
     5
     6  my $WTR = IO::Handle->new();
     7  my $RDR = IO::Handle->new();
     8
     9  my $line;
    10  $SIG{ALRM} = sub { $line = undef; die };
    11
    12  # Execute bc in trusted remote machine
    13  my $pid = open2($RDR, $WTR, 'ssh europa bc');
    14
    15  while (<STDIN>) {         # read command from user
    16    print $WTR $_;          # write a command to europa bc
    17    alarm(2); # bc sometimes does not answer
    18    eval {
    19      $line = <$RDR>;
    20    };
    21    alarm(0);
    22    print STDOUT $line if defined($line);
    23  }
    24  print $WTR "quit\n";
    25  wait;
Sigue un ejemplo de ejecución:
lhp@nereida:~/Lperl/src/perl_networking/ch2$ open2bc.pl
4*32*2   <--- escrito por el usuario
256      <=== respuesta de bc europa
a=5^2    <--- escrito por el usuario
a        <--- escrito por el usuario
25       <=== respuesta de bc europa
quit     <--- escrito por el usuario

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