我有一个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脚本。
有没有人有一个有效的解决方案?
答案 0 :(得分:5)
更新:根据您的评论,我觉得您的程序不是Linux或Windows上最佳做法的示例。但是,我确信,在阅读Win32::Process
的文档时,您注意到可以在进程上调用Kill
方法来终止它。所以,我改变了下面的例子。
如果您提供真实的代码,获得有用帮助的几率会呈指数增长。以下是Win32::Process::Create
的参数:
$iflags
: flag:继承调用进程句柄
现在,我不确定您是否尝试捕获第二个进程的STDOUT
,或者您是否尝试将其STDOUT
输出显示在与父进程相同的控制台中。< / p>
如果是后者,则以下脚本说明了一种方法:
#!/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工具。例如,请阅读perldoc -f open
和perldoc perlipc
(请参阅esp。Using open for IPC)。
更好地解释您的问题,以获得解决您的特定情况而非一般性的答案。
答案 1 :(得分:0)
在$ filepath之前使用-w修复它!但仍需要解释。