Sto provando a scrivere un server socket che si biforca per ogni connessione. Ho avuto successo salvo un piccolo avvertimento: i miei processi figlio utilizzano Net: OpenSSH-> capture2() che richiede che $ SIG {CHLD} non sia impostato su IGNORE o su un gestore di segnale personalizzato. Come posso raccogliere i miei figli senza impostare il gestore del segnale o rallentare il processo genitore con wait o waitpid?
Ecco il mio codice del server:
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;
}
Se uso il codice come mostrato sopra, tutto funziona ma io alla fine con un po 'di processi di zombie. Se aggiungo
local $SIG{CHLD} = 'IGNORE';
gli zombie sono mietuto, ma il Net :: OpenSSH-> capture2() chiamata di metodo ha un codice di ritorno incasinato. Presumo che il mio gestore di segnale interferisca con un gestore personalizzato che Net :: OpenSSH deve funzionare correttamente?
+1 'waitpid' al di fuori di un gestore' SIGCHLD' è anche efficace per sbarazzarsi degli zombi – mob