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/コンテキスト」エラーを強制するのが比較的簡単であるthreadsためです。

于 2012-11-21T20:30:34.470 に答える