2008-09-26 3 views
2

STDIN을 통해 클라이언트 프로세스와 통신하는 서버 코드를 작성 중입니다. 클라이언트의 STDOUT에서 비동기 적으로 응답을받는 perl 코드 스 니펫을 작성하려고합니다. 코드 차단 버전은 다음과 같습니다.Perl - Win32 - 다른 프로세스에서 파일 핸들을 non-blocking으로 읽는 법?

sub _read_from_client 
{ 
    my ($file_handle) = @_; 
    while (my $line = <$file_handle>) { 
     print STDOUT $line; 
    } 
    return; 
} 

중요하게도 코드 단편은 Win32 플랫폼에서 작동해야합니다. * nix 플랫폼에 대한 많은 솔루션이 있습니다. 저는 ActivePerl 5.10을 사용하고 있습니다. Perlmonks

답변

5

This thread는 Perl로 Windows에서이 방법 소켓 블로킹을 할 수 있습니다 제안 : 스레드에서

ioctl($socket, 0x8004667e, 1); 

자세한 내용과 자원을

+0

http://www.perlmonks.org/?node_id=529812 나는 'sysread'와 'ioctl'을 사용하는 것에 대해별로 흥분하지 않았다. 왜냐하면 그것들은 내가 원하는 것보다 낮은 수준이기 때문이다. 다른 방법 (예 : 잘 수용된 CPAN 모듈)이 있다면 - 알고 싶습니다. – schwerwolf

3

당신은 저를 가고 싶어하지 않는 경우 당신은 다른보다 체계적인 솔루션을 봐야 할 것입니다.

thread을 사용하여 입력 내용을 읽고 모든 데이터를 Thread::Queue으로 처리 한 다음 주 스레드에서 처리 할 수 ​​있습니다.

이벤트 프레임 워크를 구현하는 POE, 특히 POE::Wheel::Run::Win32을 볼 수 있습니다. 또한 잠재적으로 코드에서 훔쳐서 비 블로킹 읽기를 직접 구현할 수 있습니다.

코 루틴을 사용하여 협업 멀티 태스킹 시스템을 구현하는 [Coro]를 볼 수 있습니다. 이것은 시스템 스레드가 아닌 사용자 공간 스레드를 얻는 것을 제외하고는 대부분 스레드와 유사합니다.

당신이 얼마나 멀리 가고 싶은 가라는 말을하지 않았지만 선택은 sysread과 프레임 워크 사이에 있거나, 직접 프레임 워크를 작성했습니다. 가장 쉬운 방법은 스레드를 사용하거나 Poe::Wheel::Run::Win32 코드를 사용하는 것입니다.