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
