2010-08-12 2 views
7

모든 연결에 대해 포크하는 소켓 서버를 작성하려고합니다. 나는 하나의 작은 경고를 제외하고 성공했다 : 나의 자식 프로세스는 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가 제대로 작동하는 데 필요한 일부 사용자 지정 처리기를 방해한다고 가정합니다.

답변

11

앞서 가서 부모 프로세스에 SIGCHLD 핸들러를 설정할 수 있지만 자식 프로세스에서 사용하지 않도록 설정 - 예를 들어 fork 호출 후 즉시 local $SIG{CHLD}을 넣어.

자식 프로세스에서 SIGCHLD 이벤트는 Net::OpenSSH 메서드에서 발생하고 Net::OpenSSH 모듈에서 이러한 이벤트를 처리합니다.

상위 프로세스에서 SIGCHLD 이벤트는 종료하는 하위 프로세스에서 발생합니다. 그것들은 당신이 흥미를 느끼는 사건들과 좀비들을 막기 위해 당신이 처리해야 할 사건들입니다.

8

자식을 무시하고 Net :: OpenSSH를 같은 프로세스에서 사용할 필요가없는 경우 Net :: OpenSSH를 사용하지 않는 프로세스에서 $SIG{CHLD} = 'IGNORE'을 사용할 수 있습니다 (예 : " auto-reaped "자식)을 사용하고 Net :: OpenSSH (예 : 서버의 자식)를 사용하는 프로세스에서 $SIG{CHLD} = 'DEFAULT'으로 재설정하십시오.


양자 택일로, 당신은 각각의 새로운 클라이언트 연결 후에서 루프에서 비 블로킹 waitpid를 사용할 수 있습니다. 한 명 이상의 좀비가 계속 걸어 다닐 수는 있지만 다음 번 연결시에는 모두 거둬 들일 것입니다. select (또는 IO::Select과 같은 것)으로 전환하면 좀비의 "수명"에 상한선을 설정할 수 있습니다. 리스닝 소켓에서 선택을 수행하고 타임 아웃이 끝날 때마다 비 차단 좀비 수확을 반복합니다. 모든 "소켓 준비 완료"리턴. waitpid sectionperlfunc manpage의에서

:

당신이

use POSIX ":sys_wait_h"; 
#... 
do { 
    $kid = waitpid(-1, WNOHANG); 
} while $kid > 0; 

은 다음 보류중인 모든 좀비 프로세스에 대한 비 블로킹 대기를 할 수 있다고합니다. 비 블로킹 대기는 waitpid (2) 또는 wait4 (2) 시스템 호출을 지원하는 시스템에서 사용할 수 있습니다.

+1

'SIGCHLD' 처리기 외부의'waitpid '+1은 또한 좀비 제거에 효과적입니다. – mob