El problema es el siguiente...
En el momento que creas el primer proceso sucede:
1) El proceso padre invoca al operador <> para realizar E/S sobre dicho filehandle, el cual, a menos que tenga algo qué leer, se pondrá a esperar.
2) El proceso hijo se pone a ejecutar la subrutina que indicas, la cual contiene un ciclo que imprime ciertos valores. Como hasta ese punto sólo esos dos procesos son los únicos que existen, siempre serán los únicos que se van a comunicar. No existe ninguna manera de ceder el paso al siguiente proceso, con dicha estructura.
Y el problema es que tu esperas que los demás procesos se ejecuten asíncronamente; lo que no estás cuidando es que TU mismo los estás serializando ya que hasta que no termine el primer fork, el segundo comienza.
Hay varias soluciones a este problema, y la mas obvia es PRE-FORKING, qué es una técnica muy utilizada por algunos servidores WEB la cual consiste en levantar una cantidad inicial de procesos que estén listos para atender N cantidad de operaciones. Con esto garantizas que... como los procesos hijo fueron creados inicialmente, cada uno podrá procesar de manera independiente las peticiones que lleguen.
Y para poder comunicar a los procesos hijo con el proceso principal existen varios mecanismos. El uso de un simple pipe no es muy seguro, ya que varios hijos intentarán escribir sobre el mismo canal al mismo tiempo. Soluciones para eso puede ser el uso de un UNIX Socket o un fifo. Otras soluciones pueden ser el uso de AIO (Asynchronous I/O) e incluso otras soluciones pueden ser el involucrar el uso de select() para multiplexar E/S entre cada hijo cuando este tenga información para el padre.
La recomendación es que... como ignoro el problema que intentas solucionar, sería interesante ver qué es lo que realmente quieres resolver y buscar posiblemente una solución idónea...
De todos modos pongo una pequeña solución levantando primeramente 3 procesos y hasta después el padre toma la salida de cada uno. Cabe señalar que no agregué ningún tipo de limpieza para los procesos hijos ni nada, con el fin de ejemplificar:
Using perl Syntax Highlighting
use strict
;
use warnings
;
use IO
::Handle;
my ($child, $parent);
pipe $child, $parent or die $!;
$child->autoflush(1
);
$parent->autoflush(1
);
for my $p (1
..3
) {
defined(my $pid = fork) or die $!;
if ($pid) {
for (1
..10
) {
sleep 1
* int(rand 3
);
print $parent "$p: $_\n";
}
exit;
}
}
while (my $line = <$child>) {
print $line;
}
Coloreado en 0.002 segundos, usando
GeSHi 1.0.8.4
Saludos,