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);
问题是,创建的新控制台中没有stdout.如果我不使用新的控制台选项,脚本将在后台静默运行.
如果我使用cmd.exe启动Perl脚本,我可以看到输出正常,但现在我无法通过Win32 :: Process控制子Perl脚本.
有没有人有一个有效的解决方案?
更新:根据您的评论,我感觉您的程序不是Linux或Windows上的最佳实践示例.但是,我确信,在阅读文档时Win32::Process,您注意到可以Kill在进程上调用该方法来终止它.所以,我改变了下面的例子来做到这一点.
如果您提供真实的代码,那么获得有用帮助的机会会呈指数级增长.以下是Win32::Process::Create:
$iflags: flag:继承调用进程处理与否
现在,我不确定您是否尝试捕获STDOUT第二个进程,或者您是否尝试将其STDOUT输出显示在与父进程相同的控制台中.
如果是后者,那么下面的脚本说明了一种方法:
#!/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'";
#!/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工具.例如,read perldoc -f open和perldoc perlipc(参见使用open for IPC).
更好地解释您的问题,以获得解决您的特定情况而非一般性的答案.
| 归档时间: | 
 | 
| 查看次数: | 5920 次 | 
| 最近记录: |