Perl forking затем останавливает несколько дочерних процессов от родительского

78
10

В этом случае мне нужно, чтобы моя программа perl запускала несколько дочерних процессов, которые длились неизвестное время, и на самом деле только родительский процесс знает, когда дочерние процессы должны закончиться. Я пытаюсь развернуть более одного процесса, а затем завершить его от родителя, но не увенчался успехом. Что я до сих пор:

Успешно завершение одного процесса, а затем его завершение

my $pid = fork();

if($pid == 0){
#do things in child process
}

else{
#examine external conditions, when the time is right:
kill 1, $pid;
}

Неудачно пытается распространить его на 2 процесса:

my $pid = fork();

if($pid != 0){ #parent makes another fork
my $pid2 = fork();
}

if($pid == 0 || $pid2 = 0){
#do things in child process
}

else{
#examine external conditions, when the time is right:
kill 1, $pid;
kill 2, $pid;
}

Я прочитал всю документацию на вилке, доступную в Интернете, и все было написано о том, чтобы отменить один процесс, который я понимаю довольно хорошо, но я не знаю, как расширить его до двух или более процессов, и был бы признателен за любую помощь о том, как это сделать.

спросил(а) 2021-01-20T01:13:55+03:00 6 месяцев назад
1
Решение
90

Как только вы хорошо поймете, что происходит в первом ответе (но только тогда!), Взгляните на Parallel :: ForkManager (или что-то подобное) для реальной работы. Есть много мелких мелких деталей, которые вы можете ошибаться при работе с дочерними процессами, поэтому использование стороннего модуля для этого может сэкономить вам много времени.

ответил(а) 2021-01-20T01:13:55+03:00 6 месяцев назад
45

Следуйте этому коду, я надеюсь, что код сам поясняет:

my $num_process = 5; ## for as many you want, I tested with 5
my %processes; ## to store the list of children

for ( 1 .. $num_process ) {

my $pid = fork();

if ( not defined $pid ) {
die "Could not fork";
}
elseif ( $pid > 0 ) {
## boss
$processes{$pid} = 1;
}
else {
#do things in child process

## exit for child, dont forget this
exit;
}
}

## when things are right to kill ;-)
foreach my $pid ( keys %processes ) {
kill 1, $pid;
}

ответил(а) 2021-01-20T01:13:55+03:00 6 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема