我正在尝试编写一个为每个连接分叉的套接字服务器。除了一个小警告外,我已经成功了:我的子进程使用 Net:OpenSSH->capture2() ,它要求 $SIG{CHLD} 不设置为 IGNORE 或自定义信号处理程序。如何在不设置信号处理程序或使用 wait 或 waitpid 减慢父进程速度的情况下收割我的孩子?
这是我的服务器代码:
my $sock = new IO::Socket::INET (
LocalHost => 'localhost',
LocalPort => '1337',
Proto => 'tcp',
Listen => SOMAXCONN,
Reuse => 1,
);
die "Could not create socket: $!\n" unless $sock;
my $new_client, $pid;
while($new_client = $sock->accept()){
next if $pid = fork;
die "fork: $!" unless defined $pid;
close $sock;
while(<$new_client> ) {
#do Net::OpenSSH stuff
}
exit;
} continue {
close $new_client;
}
如果我使用如上所示的代码,一切正常,但我最终会得到一堆僵尸进程。如果我添加
local $SIG{CHLD} = 'IGNORE';
僵尸被收割了,但是 Net::OpenSSH->capture2() 方法调用有一个混乱的返回码。我假设我的信号处理程序正在干扰 Net::OpenSSH 需要正常工作的一些自定义处理程序?