2012-01-06 2 views
0

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

Я не понимаю, что вы имеете в виду «только если firefox run»? И где это происходит в процессе ребенка? – derobert

+0

Возможно, было бы разумнее объяснить, что вы на самом деле пытаетесь сделать. Почему ваш родительский процесс заботится о том, работает ли Firefox? Что значит для вашего родительского процесса «перезапустить»? Кроме того, Perl славится простотой написания портативного кода, но если вам нужно изучить внешние процессы, вы, вероятно, столкнетесь с этим. Нужно ли вам это работать на нескольких системах или есть конкретная операционная система, на которую вы нацеливаете? – ruakh

+0

Я работаю в Linux. – geo

ответ

0

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

Смежные вопросы