Ich versuche, einen Socket-Server, der für jede Verbindung Gabeln schreibt. Ich bin erfolgreich gewesen, abgesehen von einem kleinen Vorbehalt: Meine Kind-Prozesse verwenden Net: OpenSSH-> capture2(), was erfordert, dass $ SIG {CHLD} nicht auf IGNORE oder auf einen benutzerdefinierten Signal-Handler gesetzt wird. Wie kann ich meine Kinder ernten, ohne den Signalhandler zu setzen oder den Parent-Prozess mit wait oder waitpid zu verlangsamen?
Hier ist mein Server-Code:
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;
}
Wenn ich den Code verwenden, wie oben, funktioniert alles gezeigt, aber ich mit einem Bündel von Zombie-Prozesse enden. Wenn ich
local $SIG{CHLD} = 'IGNORE';
die Zombies hinzufügen, werden geerntet, aber der Net :: OpenSSH-> capture2() -Methode hat einen Return-Code vermasselt. Ich nehme an, mein Signalhandler stört einige benutzerdefinierte Handler, die Net :: OpenSSH benötigt, um richtig zu funktionieren?
+1 'waitpid' außerhalb eines' SIGCHLD' Handlers ist auch effektiv, um Zombies loszuwerden – mob