Вопрос по fork, perl, exec – fork + exec + caller не должен ждать ребенка

3

У меня есть два сценария script_a и script_b. script_a вызывает script_b. script_b разветвляется на два процесса. Как показано ниже.

script_a ожидает завершения родительского и дочернего сценария script_b. Я хочу, чтобы script_a продолжался, не дожидаясь дочернего процесса script_b.

Что я сделал для этого в script_b, я добавил следующий код.

if (! $f_id) {
    close STDOUT;
    close STDERR;
    exec("sleep 10; echo 'i am child'");
}

Это работает для меня. script_a больше не ожидает дочерний процесс.

Мой вопрос здесь 1. Это правильный способ сделать это? 2. Родитель и дочерний процесс имеют одни и те же STDOUT и STDERR, и я бы в конечном итоге попал в беду, если есть состояние гонки? 3. Есть ли лучшие способы сделать это?

Заранее спасибо за помощь.

script_a.pl

#! /usr/local/bin/perl
print `script_b.pl`;

script_b.pl

#! /usr/local/bin/perl

$f_id = fork();

if (! $f_id) {
    exec("sleep 10; echo 'i am child'");
}

if ($f_id) {
    print "i am parent\n";
}
@Salva Это уменьшенная версия моего реального кода, так что может показаться, что я могу просто раскошелиться на script_a, но это не вариант для меня в настоящем senario. Будет ли родитель и потомок в script_b совместно использовать STDOUT и STDERR? Usha
STDOUT/STDERR не являются общими. Для начала, когда создается ребенок, все дескрипторы наследуются от родителя. Они могут быть независимо обработаны после разветвления. tuxuday
1) вы можете просто раскошелиться на script_a, но не зная вашегоreal Трудно сказать. 2) Оператор обратной цитаты просто устанавливает новый STDOUT для ребенка. STDERR является общим, хотя. salva
да, они общие salva
Делатьscript_a а такжеscript_b нужно общаться? Ваша выборка предполагает, что A хочет вывод B, но является ли он представителем реальных программ? Почему это не так?fork вариант вscript_a? Greg Bacon

Ваш Ответ

2   ответа
0

`` backticks в Perl дождитесь завершения команды. Поэтому, если вы не хотите, чтобы родительский процесс ожидал, вставьтеsytem(command &) в фоновом режиме.

Я хочу дождаться возвращения родителя. Но я не хочу ждать ребенка. Не могли бы вы дать мне знать, если у предложенного мною решения есть проблемы? Usha
1

Вместо использования `` в script_a. Мы перенаправили STDOUT и STDERR в script_a. Что-то вроде

script_a

system("script_b.pl > /var/tmp/out_file 2>&1");

script_b

#! /usr/local/bin/perl

$f_id = fork();

if (! $f_id) {
    exec("sleep 10; echo 'i am child'");
}

if ($f_id) {
    print "i am parent\n";
}

Таким образом, вызывающая сторона не дожидалась, пока ребенок в exec завершит работу.

Спасибо за помощь здесь.

Не правильный способ сделать это все же. Usha

Похожие вопросы