如何从Win32 :: Process启动的Perl进程中获取输出?

时间:2009-08-23 12:25:01

标签: windows perl winapi

我有一个Perl脚本,它通过Win32::Process在新控制台中启动另一个Perl脚本,如下所示:

Win32::Process::Create($ProcessObj,
                      "C:\\Perl\\bin\\perl.exe",
                      "$path_to_other_perl_script",
                      0,
                      NEW_CONSOLE,
                      ".");

$ProcessObj->Suspend();
$ProcessObj->Resume();
$ProcessObj->Wait(0);

问题是,新控制台中没有创建stdout。如果我不使用新的控制台选项,脚本将在后台静默运行。

如果我使用cmd.exe启动Perl脚本,我可以看到输出正常,但现在我无法通过Win32 :: Process控制子Perl脚本。

有没有人有一个有效的解决方案?

2 个答案:

答案 0 :(得分:5)

更新:根据您的评论,我觉得您的程序不是Linux或Windows上最佳做法的示例。但是,我确信,在阅读Win32::Process的文档时,您注意到可以在进程上调用Kill方法来终止它。所以,我改变了下面的例子。

如果您提供真实的代码,获得有用帮助的几率会呈指数增长。以下是Win32::Process::Create的参数:

$iflags flag:继承调用进程句柄

现在,我不确定您是否尝试捕获第二个进程的STDOUT,或者您是否尝试将其STDOUT输出显示在与父进程相同的控制台中。< / p>

如果是后者,则以下脚本说明了一种方法:

parent.pl

#!/usr/bin/perl

use strict;
use warnings;

use Win32;
use Win32::Process;

$| = 1;

my $p;

print "Starting child process ... \n";

Win32::Process::Create(
    $p,
    'c:/opt/perl/bin/perl.exe',
    'perl hello.pl',
    1,
    NORMAL_PRIORITY_CLASS,
    '.',
) or die Win32::FormatMessage( Win32::GetLastError() );

print "Waiting three seconds before killing 'hello.pl'\n";

for (1 .. 3) {
    print;
    sleep 1;
}
$p->Kill(0)
    or die "Cannot kill '$p'";

hello.pl

#!/usr/bin/perl

$| = 1;

print "Hello World\n";
print "Sleeping 1000 seconds\n";

for (1 .. 1000) {
    sleep 1;
    print '.';
}

输出:

Starting child process ...
Waiting three seconds before killing 'hello.pl'
1Hello World
Sleeping 1000 seconds
2.3.

现在,我仍然不确定您使用Win32::Process 的原因。除非有特定原因要将您的脚本绑定到Win32,否则我建议使用标准的Perl工具。例如,请阅读perldoc -f openperldoc perlipc(请参阅esp。Using open for IPC)。

更好地解释您的问题,以获得解决您的特定情况而非一般性的答案。

答案 1 :(得分:0)

在$ filepath之前使用-w修复它!但仍需要解释。