我一直在尝试使用 Perl 实用程序/模块“证明”作为某些单元测试的测试工具。单元测试比“单元”更“系统”,因为我需要分叉一些后台进程作为测试的一部分,使用以下...
sub SpinupMonitor{
my $base_dir = shift;
my $config = shift;
my $pid = fork();
if($pid){
return $pid;
}else{
my $cmd = "$base_dir\/..\/bin\/monitor_real.pl -config $config -test";
close STDOUT;
exec ($cmd) or die "cannot exec test code [$cmd]\n";
}
}
sub KillMonitor{
my $pid = shift;
print "Killing monitor [$pid]\n";
kill(1,$pid);
}
但是由于某种原因,当我让我的 .t 文件启动一些额外的进程时,它会导致测试工具在所有测试完成后挂在第一个 .t 文件的末尾,而不是继续到下一个文件或退出如果只有一个。
起初我想知道这是否可能是因为我正在杀死我的子进程并让它们失效。所以我加了..
$SIG{CHLD} = \&REAPER;
sub REAPER {
my $pid = wait;
$SIG{CHLD} = \&REAPER;
}
到代码。但这无济于事。事实上,在封闭式检查中,结果证明我的 perl 测试文件已经退出,现在是一个已失效的进程,它是证明包装脚本没有收获它的孩子。事实上,当我在测试脚本末尾添加 die() 调用时,我得到了......
# Looks like your test died just after 7.
所以我的脚本退出了,但由于某种原因,线束没有解开。
我确实确认,当我在测试失败时禁用它们时,肯定是我的子流程让它感到不安,而线束正确退出。
我在启动流程的方式上是否做错了什么,可能会以某种方式扰乱安全带?