忽略一次SIGQUIT

时间:2016-07-31 09:19:48

标签: c signals

我正在尝试编写一个函数来在进程上安装信号处理程序,以便在第一次调用时忽略SIGQUIT信号,然后在第二个SIGQUIT信号上退出。我打算使用全局变量来计算SIGQUIT信号发送的次数。

但是我遇到了实施此问题的问题。我发现SIG_IGN会忽略第一个SIGQUIT信号,但是我如何检测第一个信号来递增计数器(并且可能改变signal()以调用信号处理程序)?

我的代码如下:

// global var counter
int signal_counter = 0;

int main (int argc, const char * argv[]) {

    pid_t child_pid = 0;
    int child_status = 0;

    /* fork a child process... */
    child_pid = fork();

    if(child_pid < 0 ) { /* fork() and check if there were errors */
        perror("fork"); /* print a system-defined error message */
        exit(EXIT_FAILURE);
    }

    else if(child_pid == 0) { /* Child code */
        install_handler();
        for(; ;sleep(1)); /*loop forever*/
    }

    else { /* Parent code */
        printf("Parent processing starts\n");
        printf("\nPARENT: sending first SIGQUIT\n\n");  
        kill(child_pid,SIGQUIT);
        printf("\nPARENT: doing something\n\n");
        sleep(3);
        printf("\nPARENT: sending SIGQUIT again\n\n");  
        kill(child_pid,SIGQUIT);
    }

    return EXIT_SUCCESS;

}

void sigquit() {
    printf("SIGQUIT\n");
    sleep(2);
    exit(0);
}

void install_handler(){
    if (signal_counter == 0){
        signal(SIGQUIT, sigquit);
        signal_counter+=1;  
    }
    else{
        signal(SIGQUIT, sigquit);
    }
}

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

解决它的方法是使用posix标准。根据它,安装的信号是一次性。

第一次信号到达时,它将启动指定的方法。因此,如果另一个信号到达,那么它将被正常执行(即它将退出你的申请以获得sigquit)。