El Manejo de Excepciones PIPE

Volvamos al ejemplo 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
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