3

私は自分のプログラムで使用するサードパーティ関数を持っています。私はそれを置き換えることはできません。動的ライブラリにあるため、編集することもできません。問題は、実行時間が長すぎる場合があることです。

たとえば、この関数が 10 秒以上実行されている場合、この関数の実行を停止するために何かできますか? (このシナリオでは、プログラムを閉じても問題ありません。)

PS。私は Linux を使用しており、このプログラムを他の場所に移植する必要はありません。

私が欲しいのは次のようなものです:

#include <stdio.h>
#include <stdlib.h>

void func1 (void) // I can not change contents of this.
{
  int i; // random
  while (i % 2 == 0);
}

int main ()
{
  setTryTime(10000);
  timeTry{
     func1();
  } catchTime {
     puts("function executed too long, aborting..");
  }

  return 0;
}
4

3 に答える 3

3

もちろん。そして、あなたはあなたがあなたのタイトルで提案したのと同じようにそれをするでしょう:「信号」。

具体的には、「アラーム」信号:

于 2012-04-30T23:32:15.927 に答える
3

本当にこれを行う必要がある場合は、おそらく、関数を呼び出してその結果を呼び出し元に返すだけのプロセスを生成する必要があります。実行時間が長すぎる場合は、そのプロセスを強制終了できます。

それを独自のプロセスに入れることにより、少なくともそれが行っていたことのほとんどをクリーンアップするまともな(素晴らしいとは言えませんが、まともな)可能性があります。後の問題へ。

于 2012-04-30T23:41:40.160 に答える
0

実行中の関数を強制的にキャンセルすることの潜在的な問題は、後で返すことを意図したリソースを「所有」する可能性があることです。問題になる可能性のあるリソースの種類には、次のものがあります。

  • ヒープ メモリの割り当て (フリー ストア)
  • 共有メモリ セグメント
  • スレッド
  • ソケット
  • ファイルハンドル
  • ロック

これらのリソースの一部はプロセスごとに管理されるため、関数を別のプロセスで実行できるようにすると (おそらく を使用してfork)、簡単にきれいに強制終了できます。他のリソースはプロセスより長く存続する可能性があり、実際には明示的にクリーンアップする必要があります。オペレーティング システムによっては、関数が一部のハードウェア ドライバーまたはデバイスと対話している途中である可能性もあり、予期せず強制終了すると、そのドライバーまたはデバイスが奇妙な状態のままになる可能性があります。再起動。

関数がこれらの種類のリソースを使用しないことがわかっている場合は、自信を持ってそれを強制終了できます。ただし、次のことを保証するのは困難です。そのような決定が多数ある大規模なシステムでは (コンパイラはチェックできません)、関数内のコードの進化はfunc1()、そのようなリソースへの依存を導入する可能性があります。

これを行う必要がある場合は、別のプロセスまたはスレッドで実行し、フラグが非同期に設定されたときに func1() が終了をサポートしている場合はkill()for processesを使用することをお勧めします。選択。pthread_killpthread_cancel

于 2012-05-01T01:58:22.130 に答える