SIGINT singal只被捕获一次

时间:2017-05-31 15:21:36

标签: c unix signals sigint

以下是此问题的简单介绍:

void handler(int sig){
        if(sig == SIGINT){
                printf("Signal caught\n");
                execl("./recreate","./recreate",NULL);
        }
}

int main(){
    printf("Main start\n");
    signal(SIGINT,handler);
    while(1);

        return 0;
}

它只是在收到信号后再次自行运行。会发生的是它只能从终端读取一次CTR + C.从第二点开始,只需在控制台上写入^ C.我是否需要每次或类似的事情重置处理程序?提前谢谢。

1 个答案:

答案 0 :(得分:0)

signal是高度实现定义的,因此您应该使用sigaction。您正在观察的是所谓的signal的sysv语义 - 信号在处理程序中重置为SIG_DFL,并且不会阻止重新执行。

您可能需要以下内容:

#include <unistd.h>
#include <signal.h>
#include <stdio.h>

#define WRITE_LIT(fd, lit) write(fd, lit, sizeof lit - 1)

void handler(int sig){
        if(sig == SIGINT){
            WRITE_LIT(2, "Signal caught\n");
            execl("./recreate","./recreate", (char*)NULL);
            WRITE_LIT(2, "Couldn't run ./recreate\n");
            _exit(127);
        }
}

int main(){
    printf("Main start\n");
    sigaction(SIGINT, &(struct sigaction const){ 
        .sa_handler = handler, 
        .sa_flags = SA_NODEFER /*don't block signals for the new process image*/
    },
    0);
    while(1);
        return 0;
}

这不会重置信号,也不会阻止它(默认是在处理程序的持续时间内阻止它),因为新的过程映像可能不会阻止它。