2010-03-14 8 views
5

Estoy usando fork() en Perl en Windows (ActivePerl) para un servidor de socket básico, pero aparentemente hay problemas (no aceptará conexiones después de algunas veces), ¿hay alguna solución?¿Por qué mi programa ActivePerl en Windows deja de aceptar conexiones de socket?

Aquí está la parte del código en cuestión:

while($client = $bind->accept()) { 
    $client->autoflush(); 
    if(fork()){ $client->close(); } 
    else { $bind->close(); new_client($client); exit(); } 
} 

Respuesta

6

Sugiero instalar Net::Server y usarlo en su lugar, porque probablemente no haya una razón convincente para que usted escriba toda la lógica de escucha y bifurcación, y Net :: Server ya está bien probado para trabajar en muchas plataformas incluyendo ActivePerl. La personalidad Net::Server::Fork es la más similar al código que está escribiendo, aunque sugeriría usar Net::Server::Prefork, ya que ofrece un mejor rendimiento a un costo mínimo.

1

Windows no tiene tenedor. Los intentos de emularlo generalmente dan resultados menos que ideales.

La mejor solución es probablemente reescribir el código para que no utilice fork. Tal vez hilos?

+2

Perl en Windows emula fork() con subprocesos detrás de escena. –

3

Si por unos, quiere decir exactamente 64, entonces debería ver this discussion. En el proceso principal, debe llamar al waitpid -1,&WNOHANG de vez en cuando para limpiar los elementos secundarios completados.

Cuestiones relacionadas