私のソースコードは、子プロセスがいくつかの他のプログラム(いくつかはC++)を呼び出してテストしていました。私はプリントをチェックアウトすると、10分後に、「タイムアウトなしの\と$ nowTimeで完了した実行のn」の部分はプリントアウトしますと、子プロセスがまだ実行されていることを タイムアウトを伴うPerlのkillプロセスは無視されました
#Other variables and functions
my $MAX_TIME = 10;#testing 10 minutes
my $timeRemaining = $MAX_TIME * 60;
my $pid = fork();
if ($pid == 0) {
#child process
my $nowTime = localtime;
print "Run started at $nowTime\n";
#This run() calls a for loop in perl, in each iteration there are several C++ programs
run();
setpgrp(0,0);
}
elsif ($pid > 0){
my $nowTime = localtime;
eval{
local $SIG{ALRM} = sub {
kill -9, $pid;
print "Run completed at $nowTime\nJob time out for $MAX_TIME minutes\n";
log();
die "TIMEOUT!\n";
};
alarm $timeRemaining;
waitpid($pid, 0);
};
print "Run completed at $nowTime with no timeout\n";
}
は、私は気づきました。親プロセスの
die "TIMEOUT!\n";
部分は実行されません。 C++プログラムのために、perlプログラムが起動してもそれを強制終了できないのでしょうか?
はヒント:負のシグナル番号を避けてください。混乱の原因となることがあります。 (例えば、シェルコマンド 'kill -9 $ pid'は、プロセスグループではなくプロセスにシグナルを送ります。)シェルやシステムコールのような負のPIDを使用します:' kill 9、 - $ pid; '、またはもっと良いことに、 'kill KILL => - $ pid;' – ikegami
ありがとう。私は実際の 'run()'プログラムを 'print current_time() 'のようなダミーコードに置き換えた場合、\ n";睡眠1200;親プロセスが子プロセスを終了させようとしているにもかかわらず、print current_time()、 "\ n"; 'print current_time()の2行目\ n"; "は1200時(20分)に実行されます。 – jsh6303
ヒント: 'setpgrp(0,0);'は 'setpgrp();'と書くことができます – ikegami