open2 del modulo IPC::Open2
provee de canales de lectura-escritura en ambos extremos.
Aqui tenemos un ejemplo de uso de open2 .
Para llamar a open2 le pasamos referencias a typeglobs
o bien objetos IO::Handle
use IPC::Open2; use IO::Handle; ($reader, $writer) = (IO::Handle->new, IO::Handle->new); open2($reader, $writer, $program);Esto hace que se ejecute
$program de manera que su entrada
queda conectada a $reader y su salida a $writer.
El modo autoflush queda automáticamente establecido para
el manejador de salida $writer.
También se puede llamar de esta otra forma:
$pid = open2(\*READ, \*WRITE, $program);e incluso
$pid = open2(\*READ, \*WRITE, $program, "arg1", "arg2", ... );
También se puede llamar con el formato que vemos en la línea 30 del siguiente código. Los dos primeros argumentos representan manejadores de fichero.
lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n open2noclose.pl
1 #!/usr/bin/perl -w
2 use strict;
3 use FileHandle;
4 use IPC::Open2;
5 my $poetry1 =<< 'EOI1';
6 while( exists( $the{'matrix'} ) ) {
7 $the{'humanrace'} = "will never be free";
8 }
9 __EOT__
10 EOI1
11
12 my $poetry2 =<< 'EOI2';
13 $when=map{i$_}@wrong and time?is:out;
14 accept the, truth and wait;a while();
15 listen to, yourself;no fatal;$is=$around;
16 just; use next; chance and $build,$new_ground;
17 __EOT__
18 EOI2
19
20 sub getFromWriter {
21 my $got;
22 while ($got = <Reader>) {
23 last if $got =~ m{__EOT__};
24 $got =~ s/^ *//;
25 $got =~ s/\t/ /;
26 print "$got";
27 }
28 }
29
30 my $pid = open2(*Reader, *Writer, "cat -n" );
31 print Writer $poetry1, "\n";
32 getFromWriter();
33 print Writer $poetry2, "\n";
34 getFromWriter();
35 close(Reader);
36 close(Writer);
37 do {} while wait() > -1;
y el resultado de la ejecución:
lhp@nereida:~/Lperl/src/perl_networking/ch2$ ./open2noclose.pl
1 while( exists( $the{'matrix'} ) ) {
2 $the{'humanrace'} = "will never be free";
3 }
5
6 $when=map{i$_}@wrong and time?is:out;
7 accept the, truth and wait;a while();
8 listen to, yourself;no fatal;$is=$around;
9 just; use next; chance and $build,$new_ground;
lhp@nereida:~/Lperl/src/perl_networking/ch2$
La lectura y escritura simultáneas a otro programa puede
conducir a atascos. Esto ocurre, si, por ejemplo,
nos quedamos esperando a leer al mismo
tiempo que lo hace el otro proceso.
La mayoría de los comandos Unix usan buffers en sus comunicaciones y salvo que el programa al otro lado haya sido escrito por nosotros no podemos garantizar la ausencia de atascos.
