这段代码使用xmltv抓取器下载EPG,并向tvtime (tvtime-command)发送命令以显示一条消息(等待几分钟,等待EPG更新...)沿着OSD的底部。
如果程序tvtime不运行,在tvtime中显示消息是无用的,我想停止父进程(向tvtime发送命令),而不杀伤子进程(EPG更新...)如果在子进程未完成(EPG更新...)的情况下,tvtime稍后将被打开,则重新启动父进程(向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;
}
}发布于 2012-01-06 14:44:44
我对此一点也不熟悉,但我会研究一下Perl IPC (进程间通信)。一般的想法是,子进程向父进程发出信号,然后父进程可以杀死自己。
https://stackoverflow.com/questions/8752681
复制相似问题