接続ごとにフォークするソケットサーバーを作成しようとしています。1 つの小さな注意点を除いて成功しました。私の子プロセスは 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 が適切に動作するために必要なカスタム ハンドラーに干渉していると思いますか?