我正在用 C 语言处理信号。我的主要功能基本上是使用 请求一些输入fgets(name, 30, stdin)
,然后坐在那里等待。我用 设置了一个警报alarm(3)
,并重新分配了 SIGALRM 来调用一个myalarm
简单地调用system("say PAY ATTENTION")
. 但是警报响起后,fgets()
停止等待输入,我的主 fn 继续。即使我更改myalarm
为仅设置一些变量并且不对其执行任何操作,也会发生这种情况。
void myalarm(int sig) {
//system("say PAY ATTENTION");
int x = 0;
}
int catch_signal(int sig, void (*handler)(int)) { // when a signal comes in, "catch" it and "handle it" in the way you want
struct sigaction action; // create a new sigaction
action.sa_handler = handler; // set it's sa_handler attribute to the function specified in the header
sigemptyset(&action.sa_mask); // "turn all the signals in the sa_mask off?" "set the sa_mask to contian no signals, i.e. nothing is masked?"
action.sa_flags = 0; // not sure, looks like we aren't using any of the available flags, whatever they may be
return sigaction(sig, &action, NULL); // here is where you actually reassign- now when sig is received, it'll do what action tells it
}
int main() {
if(catch_signal(SIGINT, diediedie)== -1) {
fprintf(stderr, "Can't map the SIGINT handler");
exit(2);
}
if(catch_signal(SIGALRM, myalarm) == -1) {
fprintf(stderr, "Can't map the SIGALAM handler\n");
exit(2);
}
alarm(3);
char name[30];
printf("Enter your name: ");
fgets(name, 30, stdin);
printf("Hello, %s\n", name);
return 0;
}
为什么alarm()
makefgets()
停止等待输入?
编辑:为我的catch_signal
函数添加了代码,并且根据评论之一,使用sigaction
而不是signal
,但问题仍然存在。