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() 函数的引用。

我的实际程序有两个 doMath() 函数和更多变量,我想要变量值的最终转储。因此,将所有这些变量传递给 signalHandler 然后传递给这两个函数似乎是一种低效的方式。还有其他方法吗?

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

一种更有效的方法是定义一个事件,在 main 中等待它,在信号中将其设置为关闭,然后在 main 中再次调用 doMath。

于 2012-07-28T14:18:33.633 回答