2008-09-26 61 views
2

我正在寫一些通過STDIN與客戶端進程通信的服務器代碼。我試圖編寫一個Perl代碼片斷,它異步接收來自客戶端的STDOUT的響應。阻止版本的代碼可能如下所示:Perl - Win32 - 如何從另一個進程無阻塞地讀取文件句柄?

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

重要的是,該代碼段需要在Win32平臺中工作。 * nix平臺有許多我不感興趣的解決方案,我使用的是ActivePerl 5.10。

回答

5

This threadPerlmonks建議你可以做一個插座非阻塞在Windows Perl中這樣說:

ioctl($socket, 0x8004667e, 1); 

更多詳細信息和資源,在該線程

+0

http://www.perlmonks.org/?node_id=529812 我看了一下那個鏈接 - 我對使用'sysread'和'ioctl'並不興奮,因爲它們比我想要的要低。如果還有其他方法(例如廣爲接受的CPAN模塊) - 我想知道。 – schwerwolf 2008-09-26 20:42:26

3

如果你不想去低您需要查看其他更多框架化解決方案。

您可以使用thread從輸入中讀取數據,並將它讀取的所有數據填入Thread::Queue,然後在主線程中處理該數據。

你可以看看POE,它實現了基於事件的框架,尤其是POE::Wheel::Run::Win32。可能你也可以從中竊取代碼來實現非阻塞式讀取。

您可以查看[Coro],它使用協程實現協作式多任務系統。除了您獲得用戶空間線程而非系統線程之外,這與線程大多數類似。

你還沒有說明你想走多遠,但是你的選擇是在sysread和框架之間,或者你自己寫了這個框架。最簡單的路線就是使用線程或通過Poe::Wheel::Run::Win32的代碼。

相關問題