无法更改SIGINT的默认操作

时间:2017-03-17 08:57:16

标签: c linux signals sigint sigaction

在C中,我想捕捉SIGINT信号并打印出类似的消息 "收到SIGINT"通过使用sigaction并通过

将新处理程序传递给它
sa.sa_sigaction = handler;

我不想终止该计划。

如果我通过shell运行程序并使用Ctrl + c生成信号,信号处理程序将捕获信号并打印出我的消息。

之后,它将执行终止该过程的默认操作。

我做错了什么?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <fcntl.h>
#include <string.h>
#include <signal.h>

static void handler(int sig, siginfo_t* si, void *unused){
    if(sig == SIGINT){
        printf("Signal %i received\n",si->si_signo);
    }
}

int main(int argc, char* argv[]){
    char s [256];


    struct sigaction sa;

    sigemptyset(&sa.sa_mask);
    sigaddset(&sa.sa_mask, SIGINT);
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = handler;

    if(sigaction(SIGINT, &sa, NULL) < 0 ){
        perror("sigaction");
    }

    fgets(s,sizeof(s), stdin);
    printf("%s", s);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

问题是fgets将调用read系统调用,并且当被SIGINT中断时系统调用将返回错误,请参阅阅读的手册页:

  

EINTR在读取任何数据之前,呼叫被信号中断;见信号(7)。

因此,您应该检查errno的{​​{1}},如果是fgets,请继续致电EINTR。试试我的更新程序:

fgets