Я пытаюсь написать сервер сокетов, который разветвляется для каждого соединения. Я добился успеха, за исключением одного небольшого предостережения: мои дочерние процессы используют Net:OpenSSH->capture2(), который требует, чтобы для $SIG{CHLD} не было установлено значение IGNORE или пользовательский обработчик сигналов. Как я могу собрать свои дочерние элементы, не устанавливая обработчик сигналов или замедляя родительский процесс с помощью ожидания или ожидания?
Вот мой код сервера:
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 должен работать правильно?