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