Почему моя программа ActivePerl в Windows перестает принимать сокет-соединения? - PullRequest
5 голосов
/ 14 марта 2010

Я использую fork() на Perl в Windows (ActivePerl) для базового сокетного сервера, но, очевидно, есть проблемы (он не будет принимать соединения через несколько раз), есть ли обходной путь?

Вот часть соответствующего кода:

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

Ответы [ 3 ]

6 голосов
/ 14 марта 2010

Я бы предложил установить Net :: Server и использовать его вместо этого, потому что, вероятно, у вас нет веских причин писать всю логику прослушивания и разветвления самостоятельно, а Net :: Server уже хорошо работает. проверено на работу на многих платформах, включая ActivePerl. Индивидуальность Net :: Server :: Fork наиболее похожа на код, который вы пишете, хотя я бы предложил вместо этого использовать Net :: Server :: Prefork , поскольку предлагает лучшую производительность при минимальных затратах.

3 голосов
/ 14 марта 2010

Если под несколько , вы имеете в виду ровно 64, то вы должны увидеть это обсуждение . В родительском процессе вы должны вызывать waitpid -1,&WNOHANG время от времени, чтобы очистить завершенных потомков.

1 голос
/ 14 марта 2010

В Windows нет форка. Попытки подражать ему обычно дают далеко не идеальные результаты.

Лучшее решение - переписать ваш код, чтобы он не использовал fork. Может быть, темы?

...