在perl TCP服务器中解散子进程

时间:2013-08-02 05:28:47

标签: perl sockets

我尝试使用Perl创建TCP服务器。我能够成功创建TCP服务器以满足客户端请求。但由于儿童进程已经解散,我面临一个问题。完成执行后,所有子进程都将失效。我无法解决这个问题。

    my $server = IO::Socket::INET->new
   (
    LocalAddr    => 'localhost',
    LocalPort    => 48005,
    Type         => SOCK_STREAM,
    Reuse        => 1,
    Listen       => 5
    ) or die "could not open port\n";

warn "server ready waiting for connections.....  \n";

my $client;

while ($client = $server->accept())
{
   my $pid;
   while (not defined ($pid = fork()))
   {
     sleep 5;
   }
   if ($pid)
   {
       close $client;
   }
   else
   {
       $client->autoflush(1);
       close $server;
       &printClient();
   }
}

sub printClient
{
   warn "client connected to pid $$\n";
   print $client "Test";
   exit 0;
}

1 个答案:

答案 0 :(得分:2)

为了避免僵尸进程(在列表中显示为“defunct”),您必须确认他们已停止使用wait函数。如果您对大多数Unix平台上的退出状态不感兴趣,那么在程序开始时将SIGCHLD的处理程序设置为IGNORE就足够了:

$SIG{CHLD}='IGNORE';

有关更详细的讨论,请参阅此处的信号处理部分:http://perldoc.perl.org/perlipc.html