|
Perlでサブプロセスを使用する
2023/12/31 |
| [Prev] [Next] [Top] , Perl [Prev] [Next] , [Perl Top] |
プロセスの実行状況を監視して動作するツールを作りたい
サブプロセス利用例
![]() Figure 1: サブプロセス利用例
#!perl -w
use POSIX ':sys_wait_h';
use Time::HiRes;
use IO::Handle;
use strict;
{
my $fname = 'log.txt'; # サブプロセス出力ファイル名
my $cnum = 10; # サブプロセスカウント秒数
unlink($fname) if (-f $fname); # 出力ファイル残っていたら一度消す
my $spid = fork(); # サブプロセス生成
die "ERR: sub process is not defined.\n" unless (defined($spid));
if ($spid == 0) { # サブプロセス
func_sub($fname, $cnum);
}
else { # メインプロセス
func_main($fname, $spid);
}
}
# メインプロセスはサブプロセスファイル出力を追従表示
sub func_main {
my ($fname, $spid) = @_;
print "sub process id is [$spid]\n"; # 監視対象サブプロセスID表示
while(1) { # サブプロセスファイル出力開始待ち
last if (-f $fname); # 出力ファイル見つけたらループ抜ける
Time::HiRes::usleep(100*1000); # 100ms待ち
}
my $fh; # ファイルハンドル
my $fpos; # ファイルポジション
open($fh, "< $fname");
while(1) {
my $epid = waitpid($spid, WNOHANG); # サブプロセス状態取得
my @data = <$fh>; # ファイルデータRead(Read後EOF)
print @data; # Readデータ表示
$fpos = tell($fh); # Read後ファイルポジション取得
last if ($epid == $spid); # サブプロセス終了したらループ抜ける
Time::HiRes::usleep(100*1000); # 100ms待ち
seek($fh, $fpos, 0); # seekダミー実行(EOF解除)
}
close($fh);
}
# サブプロセスはファイルに指定秒間メッセージ出力
sub func_sub {
my ($fname, $cnum) = @_;
my $fh;
open($fh, "> $fname") or die;
$fh->IO::Handle::autoflush; # バッファリング無効
for (my $i=0; $i<$cnum; $i++) {
print $fh "$i sec...\n"; # ファイルへメッセージ出力
sleep(1); # 1秒待ち
}
close($fh);
}
>test0.pl sub process id is [-5048] 0 sec... 1 sec... 2 sec... 3 sec... 4 sec... 5 sec... 6 sec... 7 sec... 8 sec... 9 sec... プロセス分岐部
{
my $fname = 'log.txt'; # サブプロセス出力ファイル名
my $cnum = 10; # サブプロセスカウント秒数
unlink($fname) if (-f $fname); # 出力ファイル残っていたら一度消す
my $spid = fork(); # サブプロセス生成
die "ERR: sub process is not defined.\n" unless (defined($spid));
if ($spid == 0) { # サブプロセス
func_sub($fname, $cnum);
}
else { # メインプロセス
func_main($fname, $spid);
}
}
サブプロセス終了監視部
#!perl -w
use POSIX ':sys_wait_h';
...中略...
# メインプロセスはサブプロセスファイル出力を追従表示
sub func_main {
my ($fname, $spid) = @_;
...中略...
open($fh, "< $fname");
while(1) {
my $epid = waitpid($spid, WNOHANG); # サブプロセス状態取得
my @data = <$fh>; # ファイルデータRead(Read後EOF)
print @data; # Readデータ表示
$fpos = tell($fh); # Read後ファイルポジション取得
last if ($epid == $spid); # サブプロセス終了したらループ抜ける
Time::HiRes::usleep(100*1000); # 100ms待ち
seek($fh, $fpos, 0); # seekダミー実行(EOF解除)
}
close($fh);
}
|
Notes
|
|
Copyright(C) 2023 Altmo
本HPについて |
| [Prev] [Next] [Top] , Perl [Prev] [Next] , [Perl Top] |