【发布时间】:2016-07-21 09:31:30
【问题描述】:
我们正在为我们的一个应用程序进行 perl 升级(5.6 到 5.8)。
在 5.6 中我们使用下面的示例代码来实现多线程,
$connection->{output} = new IO::File;
my $pid = open ($connection->{output}, "-|");
if (not defined $pid) {
die qq("open fork failed: $!);
} elsif ($pid != 0) {
$connection->{pid} = $pid;
next LOOP;
} else {
select(STDOUT);
$| = 1;
print "Something";
POSIX::_exit(0);
}
但是在 perl 5.8 中,'-|'不支持。所以我试图通过 fork() 来做同样的事情。但是如何实现'-|'通过 fork 使代码像 5.6 一样工作。
非常感谢任何帮助..
【问题讨论】:
-
你需要设置一个管道来获得相当于
-|的fork。你不能用管道open代替-|吗?它为新进程分叉、设置STDOUT,并且是非阻塞的。 -
对不起,我没听懂你,请你详细说明..
-
我不知道
IO::File做了什么,但-|通常意味着管道输出进程。如果您使用fork创建一个新进程,则必须使用pipe以便进程可以通信。否则,my $pid = open my $fh, '-|', $cmd会完全这样做。然后你从$fh读取,这就是$cmd的STDOUT。这是你需要做的吗? -
open的页面有示例。搜索“from_kid”。此外,this post很容易浮现在脑海中。关于“piped open”还有更多内容。 (如果我明白你需要做什么。) -
Perl 5.8 仍然很旧。如果您正在进行更新,为什么不直接推进到一个不是生命终结的版本呢?从 2003 版本的 perl 迁移到 2008 版本的 perl 是一个进步,但您仍然落后 8 年。