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] |