2012-01-06 14 views
0

このコードは、xmltvグラバーを使用してEPGをダウンロードし、tvtime(tvtime-command)にコマンドを送信してメッセージを表示しますOSD。PERL:子プロセスを停止せずに親プロセスを停止して再起動する

プログラムtvtimeが実行されていない場合、tvtimeにメッセージを表示するのに役に立たず、親プロセス(tvtimeにコマンドを送信する)を停止したい場合、子供(EPGアップデート...)を強制終了せずに、子が終了していない間(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を実行している場合のみ」とはどういう意味ですか?そして、この子プロセスはどこに入りますか? – derobert

+0

多分あなたがしようとしていることを説明する方が理にかなっています。なぜあなたの親プロセスはFirefoxが動作しているかどうかを気にしませんか?あなたの親プロセスが「再起動」するのはどういう意味ですか?また、Perlは移植性のあるコードを書くのが容易であることで有名ですが、外部プロセスを調べる必要がある場合は、おそらくその限界に打ち勝つでしょう。複数のシステムで動作するためにはこれが必要ですか、またはターゲットとするオペレーティングシステムがありますか? – ruakh

+0

私はlinuxで働いています。 – geo

答えて

0

ノーによってだが、この精通意味が、私はPerl IPC(プロセス間通信)になります。一般的な考え方は、子プロセスが親に信号を送り、子プロセスがそれ自身を殺すことができるということです。

関連する問題