管道在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