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

Nas*_*eer 1 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);
Run Code Online (Sandbox Code Playgroud)

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

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

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

Sin*_*nür 5

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

如果您提供真实的代码,那么获得有用帮助的机会会呈指数级增长.以下是Win32::Process::Create:

$iflags: flag:继承调用进程处理与否

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

如果是后者,那么下面的脚本说明了一种方法:

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'";
Run Code Online (Sandbox Code Playgroud)

hello.pl

#!/usr/bin/perl

$| = 1;

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

for (1 .. 1000) {
    sleep 1;
    print '.';
}
Run Code Online (Sandbox Code Playgroud)

输出:

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

现在,我仍然不确定你为什么使用它Win32::Process.除非有特定的理由将脚本绑定,否则Win32我建议使用标准的Perl工具.例如,read perldoc -f openperldoc perlipc(参见使用open for IPC).

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