Una excepción a esta regla es la función  sleep  la cual suspende 
el programa por el número de segundos indicado como argumento.
Si una señal interrumpe al proceso que está ejecutando
 sleep  la función sleep retornará
antes del número de segundos que se le hubiera indicado.
Esta caracteristica es muy útil para hacer que un proceso
sea desplanificado por un tiempo ilimitado hasta que ocurra un determinado
suceso.
Otra excepción es la función  select  la cual puede
ser utilizada para esperar a que uno de un conjunto de manejadores
de fichero este listo para E/S. La función admite un umbral de tiempo.
Si el umbral se sobrepasa sin que ningún manejador esté listo 
la función select termina.
De hecho en programas antiguos (o escritos usando un estilo 
obsoleto) es común ver el uso de select para emular un sleep
con un número fraccional de segundos:
                   select(undef, undef, undef, 0.25);
En vez de esto es mejor usar las funciones  usleep  y  nanosleep 
del módulo Time::HiRes.
sub start { my ($s,$identification)=@_;
  die "Cannot start another process while you are in the child process"
    if $s->{in_child};
  while ($s->{max_proc} && ( keys %{ $s->{processes} } ) >= $s->{max_proc}) {
    $s->on_wait;
    $s->wait_one_child(defined $s->{on_wait_period} ? &WNOHANG : undef);
  };
  $s->wait_children;
  if ($s->{max_proc}) {
    my $pid=fork();
    die "Cannot fork: $!" if !defined $pid;
    if ($pid) {
      $s->{processes}->{$pid}=$identification;
      $s->on_start($pid,$identification);
    } else {
      $s->{in_child}=1 if !$pid;
    }
    return $pid;
  } else {
    $s->{processes}->{$$}=$identification;
    $s->on_start($$,$identification);
    return 0; # Simulating the child which returns 0
  }
}
.....
run_on_wait { my ($s,$code, $period)=@_;
  $s->{on_wait}=$code;
  $s->{on_wait_period} = $period;
}
sub on_wait { my ($s)=@_;
  if(ref($s->{on_wait}) eq 'CODE') {
    $s->{on_wait}->();
    if (defined $s->{on_wait_period}) {
        local $SIG{CHLD} = sub { } if ! defined $SIG{CHLD};
        select undef, undef, undef, $s->{on_wait_period}
    };
  };
};
sub wait_children { my ($s)=@_;
  return if !keys %{$s->{processes}};
  my $kid;
  do {
    $kid = $s->wait_one_child(&WNOHANG);
  } while $kid > 0 || $kid < -1; # AS 5.6/Win32 returns negative PIDs
};
Cuando el periodo utilizado en el callback asociado con on_wait
es grande (práctica 
3.11)
el programa que usa el módulo parece tardar en exceso.
¿Sabría explicar la causa de ese fallo?Casiano Rodríguez León
