1

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

这是在一个线程内执行的,因此当子进程退出时,其他线程仍然未加入。

4

1 回答 1

2

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

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

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

退出状态仍将像往常一样在waitpid/中可用。$?

您可以做的最安全的事情是在多线程时不要分叉。这对应用程序和实现都是危险的。应用程序,因为子进程将运行父线程的副本。实施,因为这样做时强制“不平衡范围/保存/tmps/context”错误相对容易threads

于 2012-11-21T20:30:34.470 回答