我正在尝试处理线程内的超时。我的脚本有4个线程,每个线程需要执行命令,如果花费的时间太长,则终止命令进程。
我在做的是:
my $pid;
if (!($pid = fork))
{
my $pid2;
if (!($pid2 = fork))
{
exec_cmd $command;
}
local $SIG{ALRM} = sub {kill 9, $pid2;};
alarm $timeout;
waitpid $pid2, 0;
exit(0);
}
waitpid $pid, 0;
$ret = $?;
这是在一个线程中执行的,所以当子进程退出时,其他线程仍然没有连接。
答案 0 :(得分:2)
我想你在问,我怎样才能对从perl线程产生的子进程的执行施加时间限制,并捕获该子进程的退出代码?
您可以做的最简单的事情(在UNIX系统上)是为子进程本身设置警报:
my $pid = fork();
if (defined($pid) and $pid == 0) {
alarm($timeout); # Preserved across exec()
exec(...);
die "exec(): $!";
}
退出状态仍将照常在waitpid
/ $?
中提供。
你可以做的最安全的事情不是在多线程时分叉。这对应用程序和实现都很危险。应用程序,因为子级将具有父级线程的运行副本。实现,因为在执行此操作时,threads
强制执行“不平衡范围/保存/时间/上下文”错误相对容易。