sigaction()未捕获SIGINT信号

时间:2018-06-23 11:46:06

标签: c signals

我目前正在学习C语言中的信号,并且有一个小程序,该程序应该不会因使用SIGINT接收到sigaction()信号而终止。

尽管我觉得很好,但下面编写的代码确实会终止。也许我有点失踪。有人看到了,为什么它仍然终止?

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

void handle() { printf("%s%d%s", "I won't die....: ", getpid(), "\n"); }

int main() {
  struct sigaction sa;
  sa.sa_handler = handle;
  int k = 0;
  sigaction(SIGINT, &sa, NULL);
  // signal(SIGINT, handle); //signal works just fine

  while (k < 60) {
    printf("%s", "sleeping... \n");
    sleep(1);
    k = k + 1;
  }
}

其他信息:我的操作系统是Windows,但是我在Linux子系统的Bash中编译并执行该程序。

1 个答案:

答案 0 :(得分:3)

打开sigaction()的手册页,了解struct sigaction的所有成员并填写struct sigaction的所有成员。

struct sigaction {
            void     (*sa_handler)(int);
            void     (*sa_sigaction)(int, siginfo_t *, void *);
            sigset_t   sa_mask;
            int        sa_flags;
            void     (*sa_restorer)(void);
};

这里

struct sigaction sa;

如@AnttiHaapala所指,saautomatic存储时间的变量,您没有初始化其成员,它调用未定义的行为,就像所有其他字段一样包含垃圾sa.sa_handler

除外

所以您需要像{p>那样填充struct sigaction的其他成员

sa.sa_handler = handle;
sa.sa_flags = 0;
sigemptyset(&sa.sa_mask);

或者像{p>一样初始化sa本身

struct sigaction sa = {0};

在信号处理程序中编写printf()语句也不是一个好习惯,请在此处阅读How to avoid using printf in a signal handler?