next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: La Depuración de Procesos Sup: Gestión de Procesos Ant: La función fork Err: Si hallas una errata ...


La función pipe

La función pipe abre un par de manejadores de fichero conectados por un pipe. Tiene el formato
  $result = pipe(READHANDLE,WRITEHANDLE)
Se utiliza con fork. 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 [5]:

lhp@nereida:~/Lperl/src/perl_networking/ch2$ cat -n facfib.pl
 1  #!/usr/bin/perl
 2  # file: facfib.pl
 3  # Figure 2.2: Using pipe() to create linked filehandles
 4
 5  use strict;
 6  my $arg = shift || 10;
 7
 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    select WRITER; $| = 1;
13    factorial($arg);
14    exit 0;
15  }
16
17  if (fork == 0) { # second child writes to WRITER
18    close READER;
19    select WRITER; $| = 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
28  sub factorial {
29    my $target = shift;
30    for (my $result = 1,my $i = 1; $i <= $target; $i++) {
31      print "factorial($i) => ",$result *= $i,"\n";
32    }
33  }
34
35  sub fibonacci {
36    my $target = shift;
37    for (my $result = 1,my $i = 1; $i <= $target; $i++) {
38      print "fibonacci($i) => ",$result += $i,"\n";
39    }
40  }
Al ejecutar se entrelazan las salidas:
lhp@nereida:~/Lperl/src/perl_networking/ch2$ ./facfib.pl 18
factorial(1) => 1
factorial(2) => 2
factorial(3) => 6
factorial(4) => 24
factorial(5) => 120
factorial(6) => 720
factorial(7) => 5040
factorial(8) => 40320
factorial(9) => 362880
factorial(10) => 3628800
factorial(11) => 39916800
factorial(12) => 479001600
factorial(13) => 6227020800
factorial(14) => 87178291200
factorial(15) => 1307674368000
fibonacci(1) => 2
factorial(16) => 20922789888000
fibonacci(2) => 4
fibonacci(3) => 7
factorial(17) => 355687428096000
fibonacci(4) => 11
fibonacci(5) => 16
factorial(18) => 6.402373705728e+15
fibonacci(6) => 22
fibonacci(7) => 29
fibonacci(8) => 37
fibonacci(9) => 46
fibonacci(10) => 56
fibonacci(11) => 67
fibonacci(12) => 79
fibonacci(13) => 92
fibonacci(14) => 106
fibonacci(15) => 121
fibonacci(16) => 137
fibonacci(17) => 154
fibonacci(18) => 172
lhp@nereida:~/Lperl/src/perl_networking/ch2$


next up previous contents index practicapracticaPP2moodleLHPmoodlepserratacpanmodulospauseperlgoogleetsiiullpcgull
Sig: La Depuración de Procesos Sup: Gestión de Procesos Ant: La función fork Err: Si hallas una errata ...
Casiano Rodríguez León
2006-02-21