write_ten.pl
de las secciones
1.6
y
1.6
en el cuál se producía
la terminación de write_ten.pl
debido
a que el proceso al otro lado sólo lee las tres primeras
(read_three.pl
).
Stein en [1] propone dos soluciones.
La primera, que se muestra a continuación consiste
en poner un manipulador para la señal PIPE (línea 8).
lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n write_ten_ph.pl 1 #!/usr/bin/perl 2 use strict; 3 use IO::File; 4 5 my $ok = 1; 6 local $SIG{PIPE} = sub { undef $ok }; 7 8 my $PIPE = IO::File->new("| read_three.pl") or die "Can't open pipe: $!"; 9 $PIPE->autoflush(1); 10 11 my $count = 0; 12 for (1..10) { 13 warn "Writing line $_\n"; 14 print $PIPE "This is line number $_\n" and $count++; 15 last unless $ok; 16 sleep 1; 17 } 18 close $PIPE or die "Can't close pipe: $!"; 19 20 print "Wrote $count lines of text\n";
El manejador pone a falso el valor de $ok
el cual
es usado en el bucle (línea 14) para detectar el cierre
prematuro de la comunicación.
Al ejecutar obtenemos la siguiente conducta:
lhp@nereida:~/Lperl/src/perl_networking/ch2$ ./write_ten_ph.pl Writing line 1 Read_three got: This is line number 1 Writing line 2 Read_three got: This is line number 2 Writing line 3 Read_three got: This is line number 3 Writing line 4 Wrote 3 lines of text
Casiano Rodríguez León