Я использую fork()
на Perl в Windows (ActivePerl) для основного сервера сокета, но по-видимому существуют проблемы (он не примет соединения после несколько раз), есть ли какое-либо обходное решение?
Вот часть соответствующих норм:
while($client = $bind->accept()) {
$client->autoflush();
if(fork()){ $client->close(); }
else { $bind->close(); new_client($client); exit(); }
}
Я бы предложил установить Net: : Server и использовать его вместо этого, потому что, вероятно, у вас нет веских причин писать всю логику прослушивания и разветвления самостоятельно, а Net :: Server уже хорошо протестирован для работы на многих платформах, включая ActivePerl. Индивидуальность Net :: Server :: Fork больше всего похожа на код, который вы пишете, хотя я бы предложил вместо этого использовать Net :: Server :: Prefork , поскольку он предлагает лучшую производительность при минимальных затратах.
Если под несколько вы имеете в виду ровно 64, то вы должны увидеть это обсуждение . В родительском процессе вы должны время от времени вызывать waitpid -1, & WNOHANG
, чтобы очистить завершенные дочерние процессы.
В Windows нет форка. Попытки подражать этому обычно дают далеко не идеальные результаты.
Лучшее решение - это, вероятно, переписать ваш код, чтобы он не использовал fork. Может быть, потоки?