c - sigaction() 没有捕捉到 SIGINT 信号

标签 c signals

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

然而,下面编写的代码确实终止了,即使它对我来说看起来很好。也许我缺少什么。有人看到,为什么它仍然终止?

#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 中编译和执行程序。

最佳答案

打开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 所指出的,sa 是一个automatic 存储持续时间的变量,您没有初始化它的成员,它会调用未定义的行为 因为所有其他字段都包含垃圾,除了 sa.sa_handler

所以你需要像这样填充struct sigaction的其他成员

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

或者初始化sa本身

struct sigaction sa = {0};

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

关于c - sigaction() 没有捕捉到 SIGINT 信号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51000843/

相关文章:

c++ - 多线程: Signal vs BusyWait(Polling), 线程间条件变量问题

c - 即使有信号,fork/exec 也会离开僵尸进程

c++ - 为什么 boost asio 信号处理程序立即被取消?

c - 区分定时器生成的 sigalrm 和用户生成的 sigalrm

C:for循环段错误(核心转储)

c - 指针间接混淆

c++ - 信号与槽QT

c - 如何在可变长度数组中存储数据而不导致内存损坏?

C - 从文件中逐行读取 - 显示错误的输出

c - 当我只调用一次 fork 时,为什么会得到多个 SIGCHLD?