PERL: остановить и перезапустить родительский процесс, не убивая ребенка - PullRequest
0 голосов
/ 06 января 2012

Этот код загружает EPG с помощью xmltv grabber и отправляет команды в tvtime (tvtime-command) для отображения сообщения (подождите несколько минут, пока EPG обновляется ...) в нижней части экранного меню.

Если программа tvtime не работает, бесполезно отображать сообщение в tvtime, и я хочу остановить родительский процесс (отправить команды в tvtime), не убивая дочерний элемент (обновления EPG ...), и если tvtime будет открыто позже, пока дочерний процесс не завершен (обновления EPG ...), перезапустите родительский процесс (отправьте команды в tvtime).

use strict;
use warnings;
use File::Temp qw(tempfile);

$tmp = new File::Temp( UNLINK => 0 );;

defined(my $pid = fork) or die "Couldn't fork: $!";

#child process
if ($pid == 0) {
    system("tv_grab_fi | tv_sort >> $tmp");
    my $HOME = $ENV{HOME};
    system("mv $tmp $HOME/.xmltv/EPG.xml");
    unlink($tmp);
    exit;
}

use POSIX qw(:sys_wait_h);

#parent process
while (! waitpid($pid, WNOHANG)) {
    system("tvtime-command DISPLAY_MESSAGE \'Wait several minutes while EPG updates...\'");
    sleep 1;
}

Спасибо

Мое неумное решение:

#parent process
while (! waitpid($pid, WNOHANG)) {
       open(PS, "ps aux | grep \[tv\]time |") || die "Can't open PS: $!\n";
       while ( <PS> ) {
         system("tvtime-command DISPLAY_MESSAGE \'Wait several minutes while EPG updates...\'");
         sleep 1;
        }
}

1 Ответ

0 голосов
/ 06 января 2012

Я отнюдь не знаком с этим, но я бы посмотрел на Perl IPC (Межпроцессное взаимодействие).Общая идея заключается в том, что дочерний процесс сигнализирует родителю, который затем может убить себя.

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