Этот код загружает EPG с захватчиком xmltv и отправляет команды tvtime (tvtime-command) для отображения сообщения (подождите несколько минут при обновлении EPG ...) в нижней части OSD.PERL: остановить и перезапустить родительский процесс без убийства ребенка
Если программа 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;
}
}
Я не понимаю, что вы имеете в виду «только если firefox run»? И где это происходит в процессе ребенка? – derobert
Возможно, было бы разумнее объяснить, что вы на самом деле пытаетесь сделать. Почему ваш родительский процесс заботится о том, работает ли Firefox? Что значит для вашего родительского процесса «перезапустить»? Кроме того, Perl славится простотой написания портативного кода, но если вам нужно изучить внешние процессы, вы, вероятно, столкнетесь с этим. Нужно ли вам это работать на нескольких системах или есть конкретная операционная система, на которую вы нацеливаете? – ruakh
Я работаю в Linux. – geo