Múltiples escritores

En el ejemplo el proceso padre usa el de lectura y los procesos hijos comparten el de escritura. El siguiente ejemplo esta tomado del libro de Stein [1]:

lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n facfib.pl
 1  #!/usr/bin/perl -w
 2  use strict;
 3  use IO::Handle;
 4
 5  my $arg = shift || 10;
 6
 7  my ($READER, $WRITER) = (IO::Handle->new, IO::Handle->new);
 8  pipe($READER, $WRITER) or die "Can't open pipe: $!\n";
 9
10  if (fork == 0) { # first child writes to $WRITER
11    close $READER;
12    $WRITER->autoflush(1);
13    factorial($arg);
14    exit 0;
15  }
16
17  if (fork == 0) { # second child writes to $WRITER
18    close $READER;
19    $WRITER->autoflush(1);
20    my $result = fibonacci($arg);
21    exit 0;
22  }
23
24  # parent process closes $WRITER and reads from $READER
25  close $WRITER;
26  print while <$READER>;
27  do {} while wait > 0;
28
29  sub factorial {
30    my $target = shift;
31    for (my $result = 1,my $i = 1; $i <= $target; $i++) {
32      syswrite $WRITER, "factorial($i) => ".($result *= $i)."\n";
33    }
34  }
35
36  sub fibonacci {
37    my $target = shift;
38    for (my $result = 1,my $i = 1; $i <= $target; $i++) {
39      syswrite $WRITER, "fibonacci($i) => ".($result += $i)."\n";
40    }
41  }
La función pipe permite al proceso padre escuchar a todos los procesos hijo en el mismo canal READER. Después del fork el lector cierra la parte WRITER y el escritor la parte READER. Si no se hiciera así el EOF causado por el cierre del WRITER no llegaría al READER. Es también importante asegurarse que el escritor está en modo autoflush .

Al ejecutar se entrelazan las salidas:

lhp@nereida:~/Lperl/src/perl_networking/ch2$ ./facfib.pl 18
fibonacci(1) => 2
fibonacci(2) => 4
factorial(1) => 1
fibonacci(3) => 7
fibonacci(4) => 11
factorial(2) => 2
fibonacci(5) => 16
factorial(3) => 6
fibonacci(6) => 22
factorial(4) => 24
fibonacci(7) => 29
factorial(5) => 120
fibonacci(8) => 37
factorial(6) => 720
fibonacci(9) => 46
factorial(7) => 5040
fibonacci(10) => 56
factorial(8) => 40320
fibonacci(11) => 67
factorial(9) => 362880
fibonacci(12) => 79
factorial(10) => 3628800
fibonacci(13) => 92
factorial(11) => 39916800
fibonacci(14) => 106
factorial(12) => 479001600
fibonacci(15) => 121
fibonacci(16) => 137
fibonacci(17) => 154
fibonacci(18) => 172
factorial(13) => 6227020800
factorial(14) => 87178291200
factorial(15) => 1307674368000
factorial(16) => 20922789888000
factorial(17) => 355687428096000
factorial(18) => 6.402373705728e+15
lhp@nereida:~/Lperl/src/perl_networking/ch2$
A la vista del funcionamiento del ejemplo resulta lógico suponer que el acceso al canal por los hijos/escritores ocurre en exclusión mutua.

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