Windows 如何在Perl中从管道进行非阻塞读取?

Windows 如何在Perl中从管道进行非阻塞读取?,windows,perl,asynchronous,pipe,Windows,Perl,Asynchronous,Pipe,我有一个程序正在调用另一个程序并处理孩子的输出,即: my $pid = open($handle, "$commandPath $options |"); 现在,我尝试了几种不同的方法来读取句柄而不阻塞,但几乎没有成功 我发现了相关的问题: 但他们面临着以下问题: ioctl始终使perl崩溃 0字节上的sysread块是常见的 我不知道如何着手解决这个问题 管道在Windows上的功能不如在Unix-y系统上的功能。不能对它们使用4参数select,默认容量很小 您最好尝试基于套接字或文件

我有一个程序正在调用另一个程序并处理孩子的输出,即:

my $pid = open($handle, "$commandPath $options |");
现在,我尝试了几种不同的方法来读取句柄而不阻塞,但几乎没有成功

我发现了相关的问题:

但他们面临着以下问题:

ioctl始终使perl崩溃 0字节上的sysread块是常见的
我不知道如何着手解决这个问题

管道在Windows上的功能不如在Unix-y系统上的功能。不能对它们使用4参数select,默认容量很小

您最好尝试基于套接字或文件的解决方法

$pid = fork();
if (defined($pid) && $pid == 0) {
    exit system("$commandPath $options > $someTemporaryFile");
}
open($handle, "<$someTemporaryFile");

请参阅-使用“选择”确定是否有任何可读取的数据。@Ether select对上的文件句柄无效windows@mobrule我的理解是,我不能在文件句柄上使用select,因此这只是重复了我当前遇到的相同问题。您不需要在文件句柄上使用select。读取耗尽的文件句柄将返回undef而不阻塞,然后您可以调用seek HANDLE,0,1清除eof条件并再次读取。@mob然后我必须搜索到我已经读取的距离吗?或者这可以处理吗?@tzenes,不,如果seek的第三个参数是1,则表示相对于当前位置的seek。如果第二个参数为零,则它不会对光标位置产生任何影响,它只会产生理想的副作用,即清除句柄上的eof和错误条件。@tzense-请参阅perldoc-f seek,特别是如何模拟tail-f的示例
use Forks::Super;
my $pid = fork { cmd => "$commandPath $options", child_fh => "out" };
my $job = Forks::Super::Job::get($pid);
while (!$job->is_complete) {
    @someInputToProcess = $job->read_stdout();
    ... process input ...
    ... optional sleep here so you don't consume CPU waiting for input ...
}
waitpid $pid, 0;
@theLastInputToProcess = $job->read_stdout();