我目前正在学习 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/