我目前正在学习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中编译并执行该程序。
答案 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所指,sa
是automatic
存储时间的变量,您没有初始化其成员,它调用未定义的行为,就像所有其他字段一样包含垃圾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?。