我的任务是使用外部实用程序(addr2line)从 perl 脚本中过滤一些数据。数据量相当大。我需要打印大量数据stdin
程序并读回大量数据(来自stdout
程序到我的脚本中)。
现在我这样做IPC::Open2
,但我不混合阅读和写作。这合法吗?将要Open2
在管道中缓冲任意大小的数据?
My code:
my $cmd="addr2line -e $prog_name ";
use IPC::Open2;
local (*Reader, *Writer);
my $pid = open2(\*Reader, \*Writer, $cmd);
for(@requests) { # this array is HUGE, 100s of thousands of entries
print Writer "$_\n";
}
close Writer;
for(@requests) {
$function_name = <Reader>;
$filesource = <Reader>;
#... store ..
}
close Reader;
waitpid($pid,0);
是的,您的程序编写方式会遇到缓冲区容量限制。您的输入缓冲区(Reader
)将填满并阻止外部程序的执行。
混合读取和写入会有所帮助,因为您清空输入缓冲区的速度与外部程序填充输入缓冲区的速度大致相同。
另一件有用的事情是使用文件进行进程间通信而不是管道或套接字(如IPC::Open2
做)。那么您将仅受可用磁盘空间量的限制。不过你可以自己做Forks::Super http://search.cpan.org/perldoc?Forks%3a%3aSuper默认情况下使用 IPC 文件。
use Forks::Super 'open2';
...
my ($Reader,$Writer,$pid) = open2(@command);
for (@requests) { print $Writer "$_\n" }
close $Writer;
for (@requests) { ... read ... }
close $Reader;
waitpid $pid,0;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)