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