我的代码如下,第一次,报警工作得很好,handler2()函数可以工作。然而,警报在实施" doMain()"之后不起作用。在" handler2()"。
我的意思是在第二次打印之后""在主要的Pleasae输入中:\ n"",handler2()不再啰嗦。
我不知道为什么?我的代码如下:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>
#include <setjmp.h>
#define MAX_LEN_COMM 64
jmp_buf jumper;
int stop =0; //o is not stop ,otherwise is stop;
void hanlder2();
void doMain();
void handler2()
{
int len_command = 0;
char character;
char commandStr[60];
printf("******************************\n");
printf("In Alarm Pleasae input: \n");
while((character=getchar())!='\n')
{
commandStr[len_command]=character;
len_command++;
}
commandStr[len_command]='\0';
printf("In Alarm input is %s\n",commandStr);
if (strcmp(commandStr,"N")==0||strcmp(commandStr,"n")==0){
printf("In Alarm You put no, we will stop alarm \n");
stop=1;
longjmp(jumper, 2);
}
else if(strcmp(commandStr,"Y")==0||strcmp(commandStr,"y")==0){
printf("In Alarm You put yes, we will continue alarm \n");
signal(SIGALRM, handler2);
alarm(5);
doMain();
}
}
void doMain(){
while(1){
setjmp(jumper);
if(stop==0){
signal(SIGALRM, handler2);
printf("return time %d\n",alarm(5));
}
int len_command = 0;
char character;
char commandStr[60];
printf("In main Pleasae input: \n");
while((character=getchar())!='\n')
{
commandStr[len_command]=character;
len_command++;
}
commandStr[len_command]='\0';
printf("In main input is %s\n",commandStr);
if (strcmp(commandStr,"N")==0||strcmp(commandStr,"n")==0){
printf("In main You put no\n");
}
else if(strcmp(commandStr,"Y")==0||strcmp(commandStr,"y")==0){
printf("In main You put yes\n");
}
}
}
void main()
{
doMain();
}
答案 0 :(得分:0)
你在做什么是非常错误的。
首先,处理程序的签名应为void handler(int sig)
。
其次,在处理程序中使用的函数非常少,因此您应尽可能快地退出处理程序并且绝对不能执行控制台i / o。您正在使用几个不安全的库函数。
最后,信号处理程序是一个函数。它运行并返回到程序被信号中断的位置。在处理程序运行期间,不传递相同类型的信号。通过从处理程序调用{{1}} - 这很疯狂 - 处理程序永远不会结束。因为它没有结束,你将不会再看到任何警报信号。