以下是我的场景的简化示例(看起来很常见);
#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然后传递给两个函数似乎是一种低效的方法。还有另一种解决方法吗?
答案 0 :(得分: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;
}
答案 1 :(得分:0)
一种更有效的方法是定义一个事件,在main中等待它,在信号中设置它,然后再等待在main中调用doMath。