管道在Windows上的功能与在Unix-y系统上不同。你不能在它们上使用4个参数select
并且默认容量很小。
您最好尝试基于套接字或文件的解决方法。
$pid = fork();
if (defined($pid) && $pid == 0) {
exit system("$commandPath $options > $someTemporaryFile");
}
open($handle, "<$someTemporaryFile");
现在你有蠕虫的一对夫妇更罐处理 - 运行waitpid
当后台进程已停止制作输出定期检查,要求seek $handle,0,1
清除EOF条件你读之后,从$handle
,清理临时文件,但它的作品。
我写了Forks::Super
模块来处理像这样的问题(以及其他许多问题)。对于这个问题,你会使用它像
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();
来源
2010-09-22 21:56:34
mob
这是Windows? – mob 2010-09-22 21:51:58
请参阅[这个答案](http://stackoverflow.com/questions/1530592/why-does-my-perl-sysread-block-when-reading-from-a-socket/1532251#1532251) - 使用'选择()'来确定是否有可供读取的数据。 – Ether 2010-09-22 21:52:58
@其他选择不能在窗口上的文件句柄上工作 – tzenes 2010-09-22 21:56:35