我遇到了这个问题,我将在下面简化:
#include <stdio.h>
#include <signal.h>
int main(void) {
signal(SIGALRM, &INThandler);
//get menu options which Im not going to put here
game(...stuff...);
}
void game(..stuff...) {
//do the game stuff AND set an alarm()
}
void INThandler(int sig) {
system("clear");
printf("Time is up!n");
//I WANT game() TO STOP WHICH WILL EXIT TO MAIN WHERE MORE STUFF IS HAPPENING
}
在游戏()中,我有
while(counter <= amount)
所以我想将变量计数器和金额传递到 INThandler 中,以便我可以更改它们,以便条件为 false,但是 INThandler 仅在警报为 0 时才调用,并且不使用参数调用。 game() 继续,我不希望它。如果有更好的方法,请告诉我。
使用全局变量作为计数器和金额?
当调用函数并且该函数中包含变量时,这些变量将在堆栈上分配。如果定义全局变量,则会在程序加载时分配该变量。信号处理程序应有权访问这些变量。
#include <stdio.h>
#include <signal.h>
#include <stdlib.h> //Also include this, needed for exit(returncode)
int counter; //Not inside any function
int amount; //All functions may access these
int main(void) {
signal(SIGALRM, &INThandler);
//get menu options which Im not going to put here
game(...stuff...);
}
void game(..stuff...) {
//do the game stuff AND set an alarm()
}
void INThandler(int sig) {
//Do stuff with counter and amount
//system("clear"); I recommend that you do not use system to clear the screen, system(command) is inefficient.
printf(" 33[H 33[JTime is up!n");
//Do that extra stuff you want to do in main here, then
exit(0);
}
另一个注意事项:根据 Linux 编程手册中的 signal(2):
signal() 的唯一可移植用途是将信号的处置设置为 SIG_DFL或SIG_IGN。使用 signal() 建立 信号处理程序因系统而异(POSIX.1 明确允许 这种变化);请勿将其用于此目的。
POSIX.1 通过指定 sigaction(2) 解决了可移植性问题,这 在信号处理程序 调用;使用该接口而不是 signal()。
要使用 sigaction 注册信号处理程序,
#include <signal.h>
int main(){
const struct sigaction saSIGALRM = {
.sa_handler = mySignalHandler, //replace this with your signal handler, it takes the same parameters as using signal()
};
sigaction(SIGALRM, &saSIGALRM, 0);
}
它比看起来简单。请记住,由于编程效率低下,今天的计算机速度很慢。拜托,拜托,拜托,为了高效的程序,请改用这个。
点击这里查看sigaction可以做的更多很酷的事情,以及为什么不使用signal()