Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?
Posted
技术标签:
【中文标题】Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?【英文标题】:Perl - Win32 - How to do a non-blocking read of a filehandle from another process? 【发布时间】:2010-09-13 16:13:32 【问题描述】:我正在编写一些通过 STDIN 与客户端进程对话的服务器代码。我正在尝试编写一个从客户端的 STDOUT 异步接收响应的 perl 代码的 sn-p。代码的阻塞版本可能如下所示:
sub _read_from_client
my ($file_handle) = @_;
while (my $line = <$file_handle>)
print STDOUT $line;
return;
重要的是,sn-p 需要在 Win32 平台下工作。 *nix 平台有很多我不感兴趣的解决方案。我使用的是 ActivePerl 5.10。
【问题讨论】:
【参考方案1】:Perlmonks 上的This thread 建议您可以通过这种方式在 Perl 中的 Windows 上创建非阻塞套接字:
ioctl($socket, 0x8004667e, 1);
该线程中的更多详细信息和资源
【讨论】:
perlmonks.org/?node_id=529812 我查看了那个链接——我对使用 'sysread' 和 'ioctl' 并不感到兴奋,因为它们的级别比我想要的低。如果还有其他方法(例如,广为接受的 CPAN 模块)- 我想知道。【参考方案2】:如果您不想走低级路线,则必须查看其他更框架化的解决方案。
您可以使用 thread 从输入中读取数据,并将其读取的所有数据填充到 Thread::Queue 中,然后在主线程中处理。
您可以查看实现基于事件的框架的POE,尤其是POE::Wheel::Run::Win32。潜在地,您还可以从中窃取代码以自己实现非阻塞读取。
你可以看看[Coro],它使用协程实现了一个协作多任务系统。这与线程大多相似,只是您获得的是用户空间线程,而不是系统线程。
你还没有说明你想走多远,但你的选择是在sysread
和一个框架之间,或者自己编写所说的框架。最简单的方法就是使用线程或通过Poe::Wheel::Run::Win32
的代码。
【讨论】:
以上是关于Perl - Win32 - 如何从另一个进程非阻塞读取文件句柄?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Perl 中的 Win32::LongPath 模块来操作长路径名?