Я пытаюсь написать сокет-сервер, который разветвляется для каждого соединения. Я добился успеха, за исключением одного небольшого предостережения: мои дочерние процессы используют 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?