Как я могу получить уведомление о завершении фонового процесса в Perl? - PullRequest
3 голосов
/ 03 февраля 2010

Я написал Perl-программу, которая разветвляет и вызывает фоновую программу в дочернем процессе и имеет бесконечный цикл while, который выполняет некоторые вещи в родительском процессе. Теперь цикл while следует оставить после завершения фоновой программы в дочернем процессе:

$pid = fork();
if ( !$pid ) {
    exec( "program args" );
} else {
    while ( 1 ) {
        # do something

        # needs help: if program terminated, break
    }
}

Ответы [ 4 ]

3 голосов
/ 03 февраля 2010

Ну, fork дает вашему родительскому процессу PID ребенка (который вы покорно получаете в своем коде). Именно так родитель может присматривать за ребенком.

Чтобы выйти из цикла после его завершения, вы можете использовать kill 0 $pid, чтобы проверить, существует ли дочерний элемент. Смотри perldoc -f kill.

2 голосов
/ 03 февраля 2010

Вам нужен обработчик сигнала, чтобы позаботиться о сигнале CHLD, когда родительский процесс отправляется при выходе из дочернего процесса.(См. perldoc perlipc для более подробной информации об обработке сигналов в perl.)

Вы можете сделать что-то вроде ниже в цикле else, чтобы пожинать дочерний процесс.</p> <pre><code>... } else { $SIG{CHLD} = \&reaper } # hash to store exit status of child processes our %child; sub reaper { my $x; while (($x = waitpid(-1,WNOHANG)) >0) { $child{$x} = $? >> 8; } }

или вы можете установить $SIG{CHLD}='IGNORE', чтобы не беспокоиться о превращении дочерних процессов в зомби.

0 голосов
/ 03 февраля 2010

В зависимости от вашего заявления вы можете время от времени проверять, закончился ли ребенок, а потом может закончить родитель. Вы можете использовать posix waitpid () с WNOHANG, чтобы сделать ожидание без блокировки, или сигналы, чтобы проверить, работает ли ваш ребенок, или вы можете использовать каналы (проверьте, когда он закрывается). Лично я бы использовал waitpid (). Есть очень хорошее объяснение с примерами в perlipc.

0 голосов
/ 03 февраля 2010

Полагаю, exec () блокируется, поэтому не может вернуться до завершения работы программы, но я могу ошибаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...