Обновление: Исходя из ваших комментариев, у меня возникает ощущение, что ваши программы не являются примерами передового опыта в Linux или Windows. Тем не менее, я уверен, что, читая документацию по Win32::Process
, вы заметили, что вы можете вызвать метод Kill
в процессе, чтобы завершить его. Итак, я изменил приведенный ниже пример, чтобы сделать это.
Ваши шансы получить полезную помощь возрастают в геометрической прогрессии, если вы предоставляете реальный код. Вот аргументы Win32::Process::Create
:
$iflags
: флаг: наследовать дескрипторы вызывающих процессов или нет
Теперь я не уверен, пытаетесь ли вы захватить 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'";
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 open
и perldoc perlipc
(см. Особенно Использование open для IPC ).
Объясните свой вопрос лучше, чтобы получить ответы, которые касаются вашей конкретной ситуации, а не общности.