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脚本.
有没有人有一个有效的解决方案?
更新:根据您的评论,我感觉您的程序不是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'";
Run Code Online (Sandbox Code Playgroud)
#!/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 open和perldoc perlipc(参见使用open for IPC).
更好地解释您的问题,以获得解决您的特定情况而非一般性的答案.