linux:报警功能有时不起作用?

时间:2014-09-24 23:59:16

标签: linux signals alarm

我的代码如下,第一次,报警工作得很好,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();

}

1 个答案:

答案 0 :(得分:0)

你在做什么是非常错误的。

首先,处理程序的签名应为void handler(int sig)

其次,在处理程序中使用的函数非常少,因此您应尽可能快地退出处理程序并且绝对不能执行控制台i / o。您正在使用几个不安全的库函数。

最后,信号处理程序是一个函数。它运行并返回到程序被信号中断的位置。在处理程序运行期间,不传递相同类型的信号。通过从处理程序调用{​​{1}} - 这很疯狂 - 处理程序永远不会结束。因为它没有结束,你将不会再看到任何警报信号。