5

fork()在 Windows 上的 Perl (ActivePerl) 上使用基本套接字服务器,但显然存在问题(几次后它不会接受连接),有什么解决方法吗?

以下是相关代码的一部分:

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

3 回答 3

6

我建议安装Net::Server并改用它,因为您可能没有令人信服的理由自己编写所有的侦听和分叉逻辑,而且 Net::Server 已经过良好测试,可以在包括 ActivePerl 在内的许多平台上工作. Net::Server::Fork个性与您正在编写的代码最相似,尽管我建议改用Net::Server::Prefork,因为它以最低的成本提供更好的性能。

于 2010-03-14T00:51:44.680 回答
3

如果几个,你的意思是 64,那么你应该看到这个讨论。在父进程中,您应该waitpid -1,&WNOHANG每隔一段时间调用一次以清理已完成的子进程。

于 2010-03-14T01:06:35.227 回答
1

Windows 没有分叉。模仿它的尝试通常会产生不太理想的结果。

最好的解决方案可能是重写您的代码,使其不使用 fork。也许线程?

于 2010-03-14T00:30:56.030 回答