모든 연결에 대해 포크하는 소켓 서버를 작성하려고합니다. 나는 하나의 작은 경고를 제외하고 성공했다 : 나의 자식 프로세스는 Net : OpenSSH-> capture2()를 사용한다. $ SIG {CHLD}가 IGNORE 나 커스텀 시그널 핸들러로 설정되어 있지 않아야한다. 신호 처리기를 설정하거나 대기 또는 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';
을 추가하면 좀비가 수확되지만, 인터넷 :: OpenSSH-> capture2() 메서드 호출은 엉망 반환 코드가 있습니다. 내 신호 처리기가 Net :: OpenSSH가 제대로 작동하는 데 필요한 일부 사용자 지정 처리기를 방해한다고 가정합니다.
'SIGCHLD' 처리기 외부의'waitpid '+1은 또한 좀비 제거에 효과적입니다. – mob