如何正确退出线程中的子进程?

时间:2012-11-20 16:14:41

标签: multithreading perl fork

我正在尝试处理线程内的超时。我的脚本有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 = $?;

这是在一个线程中执行的,所以当子进程退出时,其他线程仍然没有连接。

1 个答案:

答案 0 :(得分:2)

你在问,我怎样才能对从perl线程产生的子进程的执行施加时间限制,并捕获该子进程的退出代码?

您可以做的最简单的事情(在UNIX系统上)是为子进程本身设置警报:

my $pid = fork();
if (defined($pid) and $pid == 0) {
  alarm($timeout);  # Preserved across exec()
  exec(...);
  die "exec(): $!";
}

退出状态仍将照常在waitpid / $?中提供。

你可以做的最安全的事情不是在多线程时分叉。这对应用程序和实现都很危险。应用程序,因为子级将具有父级线程的运行副本。实现,因为在执行此操作时,threads强制执行“不平衡范围/保存/时间/上下文”错误相对容易。