Почему мой ActivePerl программирует на остановке Windows принять сокетные соединения?

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

Вот часть соответствующих норм:

while($client = $bind->accept()) {
    $client->autoflush();
    if(fork()){ $client->close(); }
    else { $bind->close(); new_client($client); exit(); }
}
5
задан brian d foy 15 March 2010 в 19:08
поделиться

3 ответа

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

6
ответ дан 13 December 2019 в 22:06
поделиться

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

3
ответ дан 13 December 2019 в 22:06
поделиться

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

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

1
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: