我正在尝试编写一个为每个连接分叉的套接字服务器.除了一个小警告之外我一直很成功:我的子进程使用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需要正常工作的一些自定义处理程序?