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 ipc 使用管道从另一个进程启动一个进程的执行

阻塞和非阻塞子进程调用

如何使用 Perl 中的 Win32::LongPath 模块来操作长路径名?

如何从 Perl 完全改变 Win32 标题栏的外观?

perl win32 api 如何遍历已打开窗口,获得每个窗口的标题内容

可以将 perl 脚本的执行权限限制为从另一个 perl 脚本调用吗?