2010-03-14 21 views
5

Ich benutze fork() auf Perl auf Windows (ActivePerl) für eine grundlegende Socket-Server, aber anscheinend gibt es Probleme (es akzeptiert keine Verbindungen nach ein paar Mal), gibt es eine Umgehungslösung? HierWarum hört mein ActivePerl-Programm unter Windows auf, Socketverbindungen zu akzeptieren?

ist der Teil des entsprechenden Code:

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

Antwort

6

Ich würde empfehlen, Net::Server zu installieren und stattdessen zu verwenden, da es wahrscheinlich keinen zwingenden Grund gibt, die gesamte Abhör- und Forking-Logik selbst zu schreiben, und Net :: Server ist bereits für viele Plattformen gut getestet ActivePerl. Die Persönlichkeit Net::Server::Fork ist dem Code, den Sie schreiben, am ähnlichsten, obwohl ich stattdessen Net::Server::Prefork vorschlagen würde, da es bessere Leistung zu minimalen Kosten bietet.

1

Windows keine Gabel hat. Versuche, es zu emulieren, ergeben normalerweise weniger als ideale Ergebnisse.

Die beste Lösung ist wahrscheinlich, Ihren Code neu zu schreiben, so dass er nicht Gabel verwendet. Vielleicht Threads?

+2

Perl unter Windows emuliert fork() mit Threads hinter den Kulissen. –

3

Wenn durch ein paar, meinen Sie genau 64, dann sollten Sie this discussion sehen. Im übergeordneten Prozess sollten Sie ab und zu die waitpid -1,&WNOHANG aufrufen, um die fertigen Kinder zu bereinigen.