0

以下は、私のシナリオの単純化された例です (これは非常に一般的なようです)。

#include <signal.h>

void doMath(int &x, int &y);
void signal_handler(int signal);

int main() {
  signal (SIGINT,signal_handler);
  int x = 10;
  int y;
  doMath(x,y);
  while(1);
  return 0;
}

void doMath(int &x, int &y) {
  for(int y=0; y<=x; y++) {
    cout << y << endl;
  } 
  return;
}

void signalHandler(int signal){
  doMath(x,y);
  exit(1);
}

この基本的なプログラムは、画面に 1 から 10 を出力し、CTRL+C が押されるまでハングします。この時点で、doMath() 関数を再度実行する必要があります。これが起こっていることを確認できる唯一の方法は、x と y を signalhandler() に渡して doMath() に渡し、doMath() 関数への参照も渡すことです。

私の実際のプログラムには 2 つの doMath() 関数とさらに多くの変数があります。変数値の最終的なダンプが必要です。したがって、これらすべての変数を signalHandler に渡してから 2 つの関数に渡すのは非効率的な方法のように思えます。これを回避する別の方法はありますか?

4

2 に答える 2

2

グローバル変数を使用する必要があると思います。

一般に、グローバル変数は避けるべきですが、他に選択肢がない場合もあります。使用をできるだけ少なくし、その使用法を明確に文書化してください。

#include <signal.h>

void signalHandler(int signal);
void doMath(int &x, int &y);

struct DoMathArgs {
  int x;
  int y;

  void callDoMath() { doMath(x,y); }
};



// We have to use this global variable to pass the arguments to doMath when
// the signal is caught, since the signal handler isn't passed any arguments
// that we can use for our own data.
DoMathArgs global_do_math_args;

int main() {
  signal (SIGINT,signalHandler);
  global_do_math_args.x = 10;
  global_do_math_args.callDoMath();
  doSomethingForever();
  return 0;
}


void signalHandler(int signal) {
  global_do_math_args.callDoMath();
  exit(1);
}

void doMath(int &x, int &y) {
  for(int y=0; y<=x; y++) {
    cout << y << endl;
  } 
  return;
}
于 2012-08-19T13:50:15.967 に答える
0

はるかに効率的なアプローチは、イベントを定義し、メインで待機し、シグナルでそれを開始し、待機後に再びメインで doMath を呼び出すことです。

于 2012-07-28T14:18:33.633 に答える