Этот код загружает 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;
}
}